android中数据库创建操作的模式

9 篇文章 0 订阅
3 篇文章 0 订阅

介绍

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
	}

}






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值