日期:2014-05-16  浏览次数:20420 次

【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(ContentValu