• 【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层中,方便管理。

  • 相关阅读:
    POCO库——Foundation组件之日期时间DateTime
    POCO库——Foundation组件之加解密Crypt
    POCO库——Foundation组件之缓存Cache
    POCO库——Foundation组件之核心Core
    POCO库——Foundation组件概述
    HP-SOCKET TCP/UDP通信框架库解析
    Notepad++ 使用nppexec插件配置简易开发环境
    Duilib源码分析(五)UI布局—Layout与各子控件
    Breakpad Google的crash捕获、抓取开源库
    Pugixml一种快速解析XML文件的开源解析库
  • 原文地址:https://www.cnblogs.com/nerve/p/3185434.html
Copyright © 2020-2023  润新知