Android下SQLite3數據庫操作筆記(二)之-SQLiteOpenHelper

在前面使用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();
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章