【android开发记录片】3.数据库SQLite 的对象封装

来源:互联网 发布:cab软件触屏 编辑:程序博客网 时间:2024/05/17 17:55

在学习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);elsereturn 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);}@Overridepublic String getDBName() {return "category";}@Overridepublic String getCreateSQL() {StringBuilder sb = new StringBuilder();sb.append("create table "+getDBName()+" (_id integer primary key autoincrement," +"name text,parentId integer);");return sb.toString();}@Overridepublic String[] getColumns() {return new String[]{"_id","name","parentId"};}/** * 在这里,使用了 getColumns()  的顺序获得数据项 */@Overridepublic 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层中,方便管理。

 

原创粉丝点击