【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层中,方便管理。
页:
[1]