介紹
android使用sqlite做爲數據庫。使用數據庫時需要用SQLiteOpenHelper創建數據庫並得到SQLiteDatabase實例db,然後通過db的接口操作數據。
問題
這裏面有一個問題:一個SQLiteOpenHelper對應一個database。Demo中給的例子將數據操作和Helper封裝到了一起,這樣要麼一張表一個數據庫文件,要麼把所有的數據操作方法都放到一個文件中。第一中做法解決不了跨表查詢的問題,第二種做法讓代碼很難維護。所以需要把這些代碼分開處理。
解決方案
首先將數據定義和數據操作分開。也就是整個app中只使用一個dbHelper類。所有的表都通過這個實例建立,更新和操作。實現方法也很簡單,用工廠方法模式實現。
如上圖,AbstractDataBaseHelper在被調用onCreate和onUpgrade時會調用子類中的getTables,然後調用table接口中的onCreate和onUpgrade。以後在添加table的時候只需要修改DatabaseHelper的getTables。對於表的定義放在具體的table子類中,其各個域可以寫成public的,因爲在數據操作的時候會調用它們。
對於數據操作層,可以按照表劃分成不同的類,每個類在操縱數據庫時都可以通過新建DatabaseHelper來獲取可讀寫的數據庫。
總結
應用工廠方法模式於數據庫表的管理能夠將數據定義,數據庫創建和數據操作分開,方便日後維護。
貼代碼就爲參考一下,要自己思考。自己添加包名。
AbstractDatabaseHelper.java
import java.util.List;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 數據庫的管理,對數據庫進行創建和升級。擴展的時候,將需要創建的表用覆蓋getTables的方式傳入
*
*/
public abstract class AbstractDatabaseHelper extends SQLiteOpenHelper {
public static final String DB_NAME = "demo.db";
public static final int VERSION = 1;
private final List<Table> tableList;
/**
* 獲取需要加入到數據庫中的表的實例
* */
protected abstract List<Table> getTables();
/**
* @param tableList
* 需要創建的表的列表
* */
public AbstractDatabaseHelper(Context context) {
super(context, DB_NAME, null, VERSION);
this.tableList = getTables();
}
@Override
public final void onCreate(SQLiteDatabase db) {
for (Table table : tableList) {
table.onCreate(db);
}
}
@Override
public final void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
for (Table table : tableList) {
table.onUpgrade(db, oldVersion, newVersion);
}
}
}
DatabaseHelper.java
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
/**
* 添加表的代碼寫在這裏
*
*/
public class DatabaseHelper extends AbstractDatabaseHelper {
private static List<Table> tables = new ArrayList<Table>();
/**
* 將添加表的代碼寫在這裏
* */
static {
// @人列表
tables.add(new PeopleTable());
}
public DatabaseHelper(Context context) {
super(context);
}
@Override
protected List<Table> getTables() {
return tables;
}
}
Table.java
import android.database.sqlite.SQLiteDatabase;
/**
* 實現這個接口的類可以被統一管理
*
*/
public interface Table {
/**
* 創建數據庫的代碼
*/
void onCreate(SQLiteDatabase db);
/**
* 升級數據庫的代碼
* */
void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
}
PeopleTable.java
import android.database.sqlite.SQLiteDatabase;
/**
* 人信息表
*
*/
public class PeopleTable implements Table {
/** 表名 */
public static String TNAME = "people";
/** 用戶id */
public static String UID = "uid";
/** 名字 */
public static String NAME = "name";
/** 拼音 */
public static String PINYIN = "pinyin";
/** 頭像地址 */
public static String URI = "uri";
/** 上次使用時間,long */
public static String LAST_DATE = "last_date";
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + TNAME + " (" + UID + " integer, " + NAME
+ " text, " + PINYIN + " text, " + URI + " text, " + LAST_DATE
+ " integer, primary key (" + NAME + "))";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}