android中數據庫創建操作的模式

介紹

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
	}

}






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