设为首页 收藏本站
查看: 1075|回复: 0

[经验分享] 【android开发记录片】3.数据库SQLite 的对象封装

[复制链接]

尚未签到

发表于 2016-12-1 11:44:22 | 显示全部楼层 |阅读模式
  在学习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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-308208-1-1.html 上篇帖子: android对sqlite数据库操作(创建 增 删 改 查) 下篇帖子: Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) — ContentProv
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表