標籤:auth eth ecs oncreate activity 原理 auto ace struct
在前面使用SQLite3的時候,並沒有留意到有SQLiteOpenHelper這個類,所以只好在Activity裡面去建立和維護資料庫跟資料表的建立。
但是,現在有了SQLiteOpenHelper這個類,就可以把資料庫和資料表,以及一些初始化的資料的維護跟Activity分開了。。。
資料庫和資料表結構的建立,是只需要執行一次的,而開啟資料庫擷取資料庫相應的SQLiteDatabase操作類則有可能是每次運行程式都需要執行的,如何把這兩個步驟操作合理的放到一個輔助類裡面呢?SQLiteOpenHelper!木錯!就是這個類,只需要繼承這個類,調用建構函式SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)然後重寫onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)這兩個方法即可(不過好像我只是使用了onCreate...)。
下面說一下這個類的大概原理,假設你的SQLiteHelper繼承於SQLiteOpenHelper類,調用SQLiteOpenHelper的建構函式並且實現了onCreate和斷onUpgrade,當你在程式中調用getWritableDatabase()方法的時候,會自動去檢查你的databases目錄,如果裡面不存在你需要開啟的資料庫檔案,則會自動調用你所寫的方法onCreate,然後返回你所建立的資料庫表象,如果已經存在則會直接返回該資料庫的表象。這樣,我們初始化的資料庫表,跟預設資料就可以放到onCreate函數裡面去實現。。。
繼承的類建構函式裡面必須調用父類(SQLiteOpenHelper)的建構函式SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)。
context是為開啟建立資料庫庫用的,name是資料庫的檔案名稱,factory設定為空白使用預設的,version是建立或開啟的資料庫的版本號碼,這個必須大於等於1
如果這一次的version版本和上一次開啟的version不一致的時候,SQLiteOpenHelper就會自動調用onUpgrade方法。。
對了,在Activity中,如果開啟了資料庫,一定要記得關閉!!!
測試SQLiteOpenHelper的一個代碼架構,
SQLiteHelper.java
package com.Yao_GUET.test; import android.content.Context; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * SQLite3資料庫輔助類 * @author Yao.GUET * blog: http://blog.csdn.net/Yao_GUET * date: 2011-07-06 */ public class SQLiteHelper extends SQLiteOpenHelper { private final static String TAG = "SQLiteHelper"; public SQLiteHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub Log.e(TAG, "SQLitehelper onCreate!"); try { db.execSQL("Create TABLE Data( " + "ID integer Primary Key AUTOINCREMENT, " + "UserName varchar(50) " + ")"); Log.e(TAG, "createDataTable OK!"); } catch (SQLException se) { se.printStackTrace(); } } @Override public void onOpen(SQLiteDatabase db) { // TODO Auto-generated method stub Log.e(TAG, "SQLiteHelper on Open!"); super.onOpen(db); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub Log.e(TAG, "SQLitehelper onUpgrade!"); } }
測試Activity
SQLiteHelperTest.java
package com.Yao_GUET.test; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.widget.Button; import android.widget.TextView; public class SQLiteHelperTest extends Activity { private final static String TAG = "SQLiteHelperTest"; private SQLiteHelper sqlHelper; private SQLiteDatabase db; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.sqlitehelper_test); sqlHelper = new SQLiteHelper(this, "test2.db", null, 2); db = sqlHelper.getWritableDatabase(); } @Override protected void onDestroy() { // TODO Auto-generated method stub Log.e(TAG, "onDestroy!"); if (db != null) db.close(); super.onDestroy(); } @Override protected void onPause() { // TODO Auto-generated method stub Log.e(TAG, "onPause"); super.onPause(); } }
【Android】Android下SQLite3資料庫的操作