【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 />
 * @创建者 :集成显卡	[email protected]
 * @创建日期 :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
 * @功能描述 :
 *	便签的分类
 * @创建者 :集成显卡	[email protected]
 * @创建日期 :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层中,方便管理。

 

你可能感兴趣的:(Android开发)