做應(yīng)用開發(fā)難免需要用到數(shù)據(jù)庫,而做Android開發(fā)就更加會經(jīng)常使用其自帶的SQLite數(shù)據(jù)庫了,因?yàn)槭褂肧QLite比使用其他方式更加易于管理和操作。下面是我寫的一個數(shù)據(jù)庫操作抽象類,由于Android自帶的SQLite數(shù)據(jù)庫操作類已經(jīng)幫助我們簡化了很多操作,所以這個抽象類主要是為了方便我們建庫和升級庫結(jié)構(gòu)使用的
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 數(shù)據(jù)庫幫手基類,一個數(shù)據(jù)庫對應(yīng)一個具體實(shí)現(xiàn)。
* 可以在內(nèi)部定義表名,字段名和各種業(yè)務(wù)邏輯操作等等。
* 對數(shù)據(jù)庫的增刪改操作,請使用事務(wù)管理。
* 對數(shù)據(jù)的查詢操作,請?jiān)谑褂肅ursor前,調(diào)用startManagingCursor()方法管理Cursor。
*
*/

public abstract class AbstractDatabaseHelper
{

/** *//**
* SQLite數(shù)據(jù)庫實(shí)例
*/
protected SQLiteDatabase mDb = null;

/** *//**
* 數(shù)據(jù)庫創(chuàng)建幫手
*/
protected CreateDBHelper mDbHelper = null;

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

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

/** *//**
* 獲得數(shù)據(jù)庫版本,值至少為1。
* 當(dāng)數(shù)據(jù)庫結(jié)構(gòu)發(fā)生改變的時候,請將此值加1,系統(tǒng)會在初始化時自動調(diào)用
* createDBTables和dropDBTables方法更新數(shù)據(jù)庫結(jié)構(gòu)。
* @return
*/
protected abstract int getDatabaseVersion();

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

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

/** *//**
*
* TODO 內(nèi)部數(shù)據(jù)庫創(chuàng)建幫手類
*
*/
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);
}

/** *//**
* 批量執(zhí)行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();
}

}
}

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

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

/** *//**
* 關(guān)閉數(shù)據(jù)庫
*/
public void close()

{
if(mDbHelper != null)

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