介绍
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
}
}