介绍

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();}@Overridepublic final void onCreate(SQLiteDatabase db) {for (Table table : tableList) {table.onCreate(db);}}@Overridepublic 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);}@Overrideprotected 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";@Overridepublic 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);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}}






更多相关文章

  1. Android与单片机的信息传输方案
  2. Android与MVC设计模式
  3. ArcGIS for Android(安卓)Runtime100 基本操作(七)——三维地图初
  4. Android:常用设定延时的方法
  5. 通过Html网页调用本地安卓(android)app程序代码
  6. ,在 java 1.8.0 版本的环境下,进行 android apk 的签名操作
  7. Android中各种Adapter的使用方法
  8. eclipse 和 Android(安卓)studio:SHA1和MD5证书指纹数据获取
  9. Android系列之GreenDao数据升级和加密(三)

随机推荐

  1. [Android]你不知道的Android进程化(1)--
  2. 你如何评价Android系统?优缺点
  3. 谷歌要求马上升级!Android迎来安全更新:修
  4. 走进Android(安卓)4.2背后强大的安全系统
  5. android 常用命令集锦 新手必知必会哦---
  6. 利用Android与iOS系统进行移动应用开发:浅
  7. 如何快速学习Android开发,必知知识点集锦!(
  8. 静心。。。静心。。。
  9. Android(安卓)仿微信, QQ 裁剪
  10. 我的2011-移动开发的梦想