做應用開發難免需要用到數據庫,而做Android開發就更加會經常使用其自帶的SQLite數據庫了,因為使用SQLite比使用其他方式更加易于管理和操作。下面是我寫的一個數據庫操作抽象類,由于Android自帶的SQLite數據庫操作類已經幫助我們簡化了很多操作,所以這個抽象類主要是為了方便我們建庫和升級庫結構使用的
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

/** *//**
* TODO 數據庫幫手基類,一個數據庫對應一個具體實現。
* 可以在內部定義表名,字段名和各種業務邏輯操作等等。
* 對數據庫的增刪改操作,請使用事務管理。
* 對數據的查詢操作,請在使用Cursor前,調用startManagingCursor()方法管理Cursor。
*
*/

public abstract class AbstractDatabaseHelper
{

/** *//**
* SQLite數據庫實例
*/
protected SQLiteDatabase mDb = null;

/** *//**
* 數據庫創建幫手
*/
protected CreateDBHelper mDbHelper = null;

/** *//**
* 獲得當前數據庫幫手類標識(一般是該類名稱),用于日志等的記錄
* @return
*/
protected abstract String getTag();

/** *//**
* 獲得數據庫名稱
* @return
*/
protected abstract String getDatabaseName();

/** *//**
* 獲得數據庫版本,值至少為1。
* 當數據庫結構發生改變的時候,請將此值加1,系統會在初始化時自動調用
* createDBTables和dropDBTables方法更新數據庫結構。
* @return
*/
protected abstract int getDatabaseVersion();

/** *//**
* 創建數據庫表的SQL語句,一個元素一條語句
* @return
*/
protected abstract String[] createDBTables();

/** *//**
* 刪除數據庫表的SQL語句,一個元素一條語句
* @return
*/
protected abstract String[] dropDBTables();

/** *//**
*
* TODO 內部數據庫創建幫手類
*
*/
private class CreateDBHelper extends SQLiteOpenHelper

{
public CreateDBHelper(Context ctx)

{
super(ctx, getDatabaseName(), null, getDatabaseVersion());
}
@Override

public void onCreate(SQLiteDatabase db)
{
// TODO Auto-generated method stub
executeBatch(createDBTables(), db);
}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO Auto-generated method stub
Log.w(getTag(), "Upgrading database '" + getDatabaseName() + "' from version " + oldVersion + " to " + newVersion);
executeBatch(dropDBTables(), db);
onCreate(db);
}

/** *//**
* 批量執行Sql語句
* @param sqls
* @param db
*/
private void executeBatch(String[] sqls, SQLiteDatabase db)

{
if(sqls == null)
return;
db.beginTransaction();
try

{
int len = sqls.length;
for(int i = 0; i < len; i++)

{
db.execSQL(sqls[i]);
}
db.setTransactionSuccessful();

}catch(Exception e)
{
Log.e(getTag(), e.getMessage(), e);

}finally
{
db.endTransaction();
}

}
}

/** *//**
* 打開或者創建一個指定名稱的數據庫
* @param dbName
* @param ctx
*/
public void open(Context ctx)

{
Log.i(getTag(), "Open database '" + getDatabaseName() + "'");
mDbHelper = new CreateDBHelper(ctx);
mDb = mDbHelper.getWritableDatabase();
}

/** *//**
* 關閉數據庫
*/
public void close()

{
if(mDbHelper != null)

{
Log.i(getTag(), "Close database '" + getDatabaseName() + "'");
mDbHelper.close();
}
}
}
如果想使用這個類,你需要編寫一個子類繼承此類并實現相應的抽象方法(主要是返回一些字符串),同時可以在內部定義表名,字段名和各種業務邏輯操作(CRUD)等等。這樣子類在被初始化并open之后,就會自動檢查數據庫是否被創建以及數據庫版本是否匹配,如果沒有被創建,則會自動被創建;如果版本變化了,則會自動調用onUpgrade方法,升級數據庫表結構。雖然此類簡化的工作量不多,但我們可以將它作為一個主體,基于這個主體,再根據業務,就可以實現更豐富的功能了。
---------------------------------------------------------
專注移動開發
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2009-03-07 00:30
TiGERTiAN 閱讀(3622)
評論(1) 編輯 收藏 所屬分類:
Java 、
Android