基于Android系统的数据库类设计
数据库SQLite是一个开源的、内嵌式的轻量级关系数据库。尽管SQLite是一个轻量级数据库,但它具备数据库的大部分功能,如触发器、索引、自动增长字段和LIMIT/OFFSET字句。由于该数据库占用资源少,目前广泛应用于嵌入式产品中。Android平台已经嵌入了SQLite数据库,对SQLite操作进行了封装,封装类库为SQLiteOpenHelper。现结合具体实例,分析自建的数据库操作类MyDb方法和步骤。
自定义类MyDb包括六个部分:构造方法MyDb( )、获取数据库实例化getInstance( )、创建表OnCreate( )、查询表Select( )、插入表insert( )和获取字段信息getID( )等方法。各部分逻辑关系图如下:
构造方法MyDb( )
public class MyDb extends SQLiteOpenHelper
{
private static int VERSION = 1;//数据库版本
private static String DB_NAME = "MyDb.db";//数据库名称
private static MyDb busDB ;
public MyDb(Context context) {
super(context, DB_NAME, null, VERSION);
}
……
}
在定义构造方法之前,先定义两个变量VERSION 、DB_NAME,为构造方法MyDb()做准备。Super()方法是调用父类构造方法,该方法有4个参数,第一个参数为context类型,即上下文对象类型;第二个参数String类型,即数据库名称;第三个参数CursorFactory类型,含义为游标工厂,这里赋值null;第四个参数VERSION,默认赋值为1。这里我们要理清MyDb的父类,从上面第一行代码我们可以得知SQLiteOpenHelper类,android开发类库中包含SQLiteOpenHelper类,该类封装了数据库SQLite,因此,我们继承SQLiteOpenHelper类,也就继承了该类的构造方法。
数据库实例化getInstance( )
public static MyDb getInstance(Context context) {
if(busDB==null){
busDB = new MyDb(context);
return busDB;
}else{
return busDB;
}
要实例化数据库,也就是要实例化MyDb(),然后返回数据库实例,该方法为其他类引用数据库实例的字段做准备,如MyDb.getInstance(context).getID(c)。
创建表OnCreate( )
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE Info (_id INTEGER PRIMARY KEY AUTOINCREMENT,id TEXT, name TEXT,phone TEXT,address TEXT,money TEXT,state INTEGER)");
SQLiteOpenHelper类提供了一个执行SQL语句的方法exeSQL(),运用该方法可以方便创建数据库表Info。
查询表Select( )
public Cursor select(String where, String orderBy) {// 返回表中的数据,where是调用时候传进来的搜索内容,orderby是设置中传进来的列表排序类型
StringBuilder buf = new StringBuilder("SELECT * FROM "+"Info");
if (where != null) {
buf.append(" WHERE ");
buf.append(where);
}
if (orderBy != null) {
buf.append(" ORDER BY ");
buf.append(orderBy);
}
Log.e("buf", buf.toString());
return (getWritableDatabase().rawQuery(buf.toString(), null));
}
查询表记录是数据库操作最常用的功能之一,select()方法根据查询条件搜索表,包括所有字段的内容,该方法可传入两个参数,一个where参数,一个orderby,分别根据字段条件和排序搜索内容。SQLiteOpenHelper类有一个方法getWritableDatabase(),能够以写的方式打开数据库引用,链式方法rawQuery()执行数据检索,rawQuery()第一个参数为带占位符的SQL语句,第二个赋值null即可,需要注意的是select( )方法返回值类型为Cursor,即数据库游标。
插入表insert( )
public void insert(String id,String name,String phone,String address,String money,int state){
ContentValues cv = new ContentValues();
cv.put("id", id);
cv.put("name", name);
cv.put("phone", phone);
cv.put("address", address);
cv.put("money", money);
cv.put("state", state);
getReadableDatabase().insert("Info", "name", cv);
insert()方法参数根据插入表字段数量确定,Info表中6个字段,都需要人工插入值。
ContentValues类对象以键值对的形式存储数据,SQLite利用ContentValues对象插入一条新的记录,较用SQL语句不易出错,但需要提醒的是ContentValues只能存储简单数据类型,如String、Int等类型。getReadableDatabase()可以以读的方式打开数据库引用,其链式方法insert()第一个参数就是数据表名Info,第二个参数表中一个字段名,也可输入null,第三个参数输入ContentValues对象cv。
获取字段信息
* @param c 查询后的游标
* @return 订单号
*/
public String getID(Cursor c){
return c.getString(1);
}
/**
* 获取姓名
* @param c 查询后的游标
* @return 姓名
*/
public String getName(Cursor c){
return c.getString(2);
}
…….
MyDb类除了实现创建表、查询记录、插入记录之外,还要完成各个字段值返回的任务,因此设计了getID()、getName()等6个方法,为视图View类调用各字段值做好准备。getID()方法参数为Cursor类型,也称做游标,对象c就是查询后的游标,游标c根据索引ID获取String类型的字段,例如c.getString(1)获得表中的订单号。