zoukankan      html  css  js  c++  java
  • 【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层中,方便管理。

  • 相关阅读:
    mysql 函数 存储过程 事件(event) job 模板
    protobuf 无proto 解码 decode 语言 java python
    mitmproxy fiddler 抓包 填坑
    android adb 常用命令
    android机器人 模拟 踩坑过程
    RabbitMQ添加新用户并支持远程访问
    Windows下RabbitMQ安装及配置
    Java mybatis mysql 常用数据类型对应关系
    easyExcel 踩坑
    linux防火墙查看状态firewall、iptable
  • 原文地址:https://www.cnblogs.com/nerve/p/3185434.html
Copyright © 2011-2022 走看看