【android开发记录片】3.数据库SQLite 的对象封装
在学习android时,做了一个简单的数据表与javaBean的映射,思路是:
定义一个Entity 的泛型抽象类,然后XXXDao 类继承于Entity,变成实体操作类,最后的bean实现序列化接口即可。
下面以一个“分类”为例说明一下:
首先是Entity.java的定义:
package org.nerve.cellnote.storage; import java.io.Serializable; import java.util.ArrayList; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; /** * @项目名称 :CellNote * @文件名称 :Entity.java * @所在包 :org.nerve.cellnote.storage * @功能描述 : * 是一个范型抽象类,模拟 JPA 形式,封装数据库的常用操作,子类必须实现如下方法以达到数据绑定:<br /> * public abstract String getDBName(); //绑定的表名 <br /> * public abstract String getCreateSQL(); //表的构造sql语句,在建表时使用 <br /> * public abstract String[] getColumns(); //表列 <br /> * public abstract T bind(Cursor c); //实体的数据注入 <br /> * <br /> * @创建者 :集成显卡 1053214511@qq.com * @创建日期 :2013-1-21 * @修改记录 : */ public abstract class Entity<T extends Serializable> { protected Context context; public Entity(Context c){ context = c; } /** * @方法名称 :getDBName * @功能描述 :对应的表名 * @return * @return :String */ public abstract String getDBName(); /** * @方法名称 :getCreateSQL * @功能描述 :创建表的SQL * @return * @return :String */ public abstract String getCreateSQL(); /** * @方法名称 :getColumns * @功能描述 :得到字段 * @return * @return :String[] */ public abstract String[] getColumns(); /** * @方法名称 :bind * @功能描述 :传入一个Cursor,绑定到实体中 * @param c * @return :void */ public abstract T bind(Cursor c); public SQLiteDatabase getDB(){ return new DBManager(context).getDB(); } public T getById(int id){ Cursor c = query("_id="+id, null, null, null, null); if(c.moveToFirst()) return bind(c); else return null; } /** * @方法名称 :getBy * @功能描述 : * * @param column 查询的字段 * @param value 值 * @return */ public T getBy(String column, String value){ Cursor c = query(column+"=?", new String[]{value}, null, null, null); if(c.moveToFirst() == false) return null; return bind(c); } /** * @方法名称 :getAll * @功能描述 :返回所有记录 * * @return */ public ArrayList<T> getAll(){ Cursor c = query(null, null, null, null, getDefaultOrderBy()); ArrayList<T> result = new ArrayList<T>(); while(c.moveToNext()){ T temp = bind(c); result.add(temp); } c.close(); return result; } /** * @方法名称 :getList * @功能描述 :根据条件得到数据列表 * * @param column 匹配的字段 * @param value 字段值 * @param orderBY 排序方式 * @return */ public ArrayList<T> getList(String column, String values, String orderBY){ Cursor c = query(column+"=?", new String[]{values}, null, null, orderBY); ArrayList<T> result = new ArrayList<T>(); while(c.moveToNext()){ T temp = bind(c); result.add(temp); } c.close(); return result; } public ArrayList<T> getListLike(String where, String[] values, String orderBY){ Cursor c = query(where, values, null, null, orderBY); ArrayList<T> result = new ArrayList<T>(); while(c.moveToNext()){ T temp = bind(c); result.add(temp); } c.close(); return result; } /** * @方法名称 :query * @功能描述 :得到一个游标,数据表名和字段都是使用默认的 * @param where * @param argsW * @param groupBy * @param having * @param orderBy * @return * @return :Cursor */ public Cursor query(String where, String[] argsW, String groupBy, String having, String orderBy){ DBManager db = new DBManager(context); return db.getDB().query(getDBName(), getColumns(), where, argsW, groupBy, having, orderBy); } /** * @方法名称 :getDefaultOrderBy * @功能描述 :得到默认的排序方式。如果子类有特别要求,重写这个方法 * @return * @return :String */ public String getDefaultOrderBy(){ return null; } /** * @方法名称 :insert * @功能描述 : * @param cv * @return 返回新增数据行的id,如果出错返回-1 * @return :long */ public long insert(ContentValues cv){ return getDB().insert(getDBName(), null, cv); } public int update(ContentValues cv, String where, String[] whereArgs){ return getDB().update(getDBName(), cv, where, whereArgs); } /** * @方法名称 :delById * @功能描述 :根据id删除数据行,返回的是删除的行数 * * @param id * @return */ public int delById(int id){ return getDB().delete(getDBName(), "_id="+id, null); } /** * @方法名称 :delBy * @功能描述 :根据条件删除数据行,返回的是删除的行数 * * @param column * @param value * @return */ public int delBy(String column, String value){ return getDB().delete(getDBName(), column+"=?", new String[]{value}); } }
再定义bean : Category.java
package org.nerve.cellnote.domain; import java.io.Serializable; /** * @项目名称 :CellNote * @文件名称 :Category.java * @所在包 :org.nerve.cellnote.domain * @功能描述 : * 便签的分类 * @创建者 :集成显卡 1053214511@qq.com * @创建日期 :2013-1-21 * @修改记录 : */ @SuppressWarnings("serial") public class Category implements Serializable{ public int id; public String name; public int parentId; public Category(){ } public Category(String name){ this.name = name; } }
最后是CategoryDao.java:
package org.nerve.cellnote.domain; import org.nerve.cellnote.storage.Entity; import android.content.Context; import android.database.Cursor; public class CategoryDao extends Entity<Category>{ public CategoryDao(Context c) { super(c); } @Override public String getDBName() { return "category"; } @Override public String getCreateSQL() { StringBuilder sb = new StringBuilder(); sb.append("create table "+getDBName()+" (_id integer primary key autoincrement," + "name text,parentId integer);"); return sb.toString(); } @Override public String[] getColumns() { return new String[]{"_id","name","parentId"}; } /** * 在这里,使用了 getColumns() 的顺序获得数据项 */ @Override public Category bind(Cursor c) { Category cg = new Category(); cg.id = c.getInt(0); cg.name = c.getString(1); cg.parentId = c.getInt(2); return cg; } }
DAO 类中重写指定的方法就可以了。
对于获取数据,可以这样:
CategoryDao categoryDao = new CategoryDao(context); return getCategoryDao().getById(id);
可以将这些操作封装在一个Service层中,方便管理。