前面简单介绍了下GreenDao的使用,从前面的介绍看来是不是觉得有点 so easy。对就是这么简单。曾经有位大神说作为一位合格的程序员就要在学习别人的东西时,有点自己的想法。为了表示我是位比较合格的程序员,今天和大家介绍下GreenDao的比较实用的封装。如果您还没来得及学习greenDao的实用详解,请前往GreenDao的使用详解学习。长话短说我们正式开始介绍。首先我们新建两个表,分别是Customer和Student表。其生成的文件如下所示。

(一)封装下DaoMaster,DaoSession,DevOpenHelper对象

其具体代码如DaoManager.java所示。

package com.jamy.DaoUtils;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import com.jamy.dao.DaoMaster;

import com.jamy.dao.DaoSession;

import de.greenrobot.dao.query.QueryBuilder;

/**

* Created by jamy on 2016/6/16.

* 进行数据库的管理

* 1.创建数据库

* 2.创建数据库表

* 3.对数据库进行增删查改

* 4.对数据库进行升级

*/

public class DaoManager {

private static final String TAG = DaoManager.class.getSimpleName();

private static final String DB_NAME="jamy.db";//数据库名称

private volatile static DaoManager mDaoManager;//多线程访问

private static DaoMaster.DevOpenHelper mHelper;

private static DaoMaster mDaoMaster;

private static DaoSession mDaoSession;

private static SQLiteDatabase db;

private Context context;

/**

* 使用单例模式获得操作数据库的对象

* @return

*/

public static DaoManager getInstance(){

DaoManager instance = null;

if (mDaoManager==null){

synchronized (DaoManager.class){

if (instance==null){

instance = new DaoManager();

mDaoManager = instance;

}

}

}

return mDaoManager;

}

/**

* 初始化Context对象

* @param context

*/

public void init(Context context){

this.context = context;

}

/**

* 判断数据库是否存在,如果不存在则创建

* @return

*/

public DaoMaster getDaoMaster(){

if (null == mDaoMaster){

mHelper = new DaoMaster.DevOpenHelper(context,DB_NAME,null);

mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());

}

return mDaoMaster;

}

/**

* 完成对数据库的增删查找

* @return

*/

public DaoSession getDaoSession(){

if (null == mDaoSession){

if (null == mDaoMaster){

mDaoMaster = getDaoMaster();

}

mDaoSession = mDaoMaster.newSession();

}

return mDaoSession;

}

/**

* 设置debug模式开启或关闭,默认关闭

* @param flag

*/

public void setDebug(boolean flag){

QueryBuilder.LOG_SQL = flag;

QueryBuilder.LOG_VALUES = flag;

}

/**

* 关闭数据库

*/

public void closeDataBase(){

closeHelper();

closeDaoSession();

}

public void closeDaoSession(){

if (null != mDaoSession){

mDaoSession.clear();

mDaoSession = null;

}

}

public void closeHelper(){

if (mHelper!=null){

mHelper.close();

mHelper = null;

}

}

}        DaoManager主要是通过单列模式获取对应的对象,以及对所有的对象进行初始化。

(二)封装一可操作不同数据表的公共基类

其集体代码BaseDao.java所示。

package com.jamy.DaoUtils;

import android.content.Context;

import android.util.Log;

import com.jamy.dao.CustomerDao;

import com.jamy.dao.DaoSession;

import java.util.List;

import de.greenrobot.dao.query.QueryBuilder;

/**

* 将所有创建的表格相同的部分封装到这个BaseDao中

* Created by jamy on 16/6/16.

*/

public class BaseDao{

public static final String TAG = BaseDao.class.getSimpleName();

public static final boolean DUBUG = true;

public DaoManager manager;

public DaoSession daoSession;

public BaseDao(Context context) {

manager = DaoManager.getInstance();

manager.init(context);

daoSession = manager.getDaoSession();

manager.setDebug(DUBUG);

}

/**************************数据库插入操作***********************/

/**

* 插入单个对象

* @param object

* @return

*/

public boolean insertObject(T object){

boolean flag = false;

try {

flag = manager.getDaoSession().insert(object) != -1 ? true:false;

} catch (Exception e) {

Log.e(TAG, e.toString());

}

return flag;

}

/**

* 插入多个对象,并开启新的线程

* @param objects

* @return

*/

public boolean insertMultObject(final List objects){

boolean flag = false;

if (null == objects || objects.isEmpty()){

return false;

}

try {

manager.getDaoSession().runInTx(new Runnable() {

@Override

public void run() {

for (T object : objects) {

manager.getDaoSession().insertOrReplace(object);

}

}

});

flag = true;

} catch (Exception e) {

Log.e(TAG, e.toString());

flag = false;

}finally {

// manager.CloseDataBase();

}

return flag;

}

/**************************数据库更新操作***********************/

/**

* 以对象形式进行数据修改

* 其中必须要知道对象的主键ID

* @param object

* @return

*/

public void updateObject(T object){

if (null == object){

return ;

}

try {

manager.getDaoSession().update(object);

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

/**

* 批量更新数据

* @param objects

* @return

*/

public void updateMultObject(final List objects, Class clss){

if (null == objects || objects.isEmpty()){

return;

}

try {

daoSession.getDao(clss).updateInTx(new Runnable() {

@Override

public void run() {

for(T object:objects){

daoSession.update(object);

}

}

});

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

/**************************数据库删除操作***********************/

/**

* 删除某个数据库表

* @param clss

* @return

*/

public boolean deleteAll(Class clss){

boolean flag = false;

try {

manager.getDaoSession().deleteAll(clss);

flag = true;

} catch (Exception e) {

Log.e(TAG, e.toString());

flag = false;

}

return flag;

}

/**

* 删除某个对象

* @param object

* @return

*/

public void deleteObject(T object){

try {

daoSession.delete(object);

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

/**

* 异步批量删除数据

* @param objects

* @return

*/

public boolean deleteMultObject(final List objects, Class clss){

boolean flag = false;

if (null == objects || objects.isEmpty()){

return false;

}

try {

daoSession.getDao(clss).deleteInTx(new Runnable() {

@Override

public void run() {

for(T object:objects){

daoSession.delete(object);

}

}

});

flag = true;

} catch (Exception e) {

Log.e(TAG, e.toString());

flag = false;

}

return flag;

}

/**************************数据库查询操作***********************/

/**

* 获得某个表名

* @return

*/

public String getTablename(Class object){

return daoSession.getDao(object).getTablename();

}

/**

* 查询某个ID的对象是否存在

* @param

* @return

*/

public boolean isExitObject(long id,Class object){

QueryBuilder qb = (QueryBuilder) daoSession.getDao(object).queryBuilder();

qb.where(CustomerDao.Properties.Id.eq(id));

long length = qb.buildCount().count();

return length>0 ? true:false;

}

/**

* 根据主键ID来查询

* @param id

* @return

*/

public T QueryById(long id,Class object){

return (T) daoSession.getDao(object).loadByRowId(id);

}

/**

* 查询某条件下的对象

* @param object

* @return

*/

public List QueryObject(Class object,String where,String...params){

Object obj = null;

List objects = null;

try {

obj = daoSession.getDao(object);

if (null == obj){

return null;

}

objects = daoSession.getDao(object).queryRaw(where,params);

} catch (Exception e) {

Log.e(TAG, e.toString());

}

return objects;

}

/**

* 查询所有对象

* @param object

* @return

*/

public List QueryAll(Class object){

List objects = null;

try {

objects = (List) daoSession.getDao(object).loadAll();

} catch (Exception e) {

Log.e(TAG,e.toString());

}

return objects;

}

/***************************关闭数据库*************************/

/**

* 关闭数据库一般在Odestory中使用

*/

public void CloseDataBase(){

manager.closeDataBase();

}

}(三)让不同的数据表对象继承BaseDao

其具体代码如StudentManager.java以及CustomerManager.java所示(由于本Demo中这两个Manager比较类似,所以只展示StudentManager.java)。

package com.jamy.DaoUtils;

import android.content.Context;

import com.jamy.dao.CustomerDao;

import com.jamy.entity.Customer;

import com.jamy.entity.Student;

import java.util.ArrayList;

import java.util.List;

import de.greenrobot.dao.query.QueryBuilder;

/**

* Created by jamy on 16/6/16.

* 在这个类中添加不同的查询条件

*/

public class StudentManager extends BaseDao{

public StudentManager(Context context) {

super(context);

}

/***************************数据库查询*************************/

/**

* 通过ID查询对象

* @param id

* @return

*/

private Student loadById(long id){

return daoSession.getStudentDao().load(id);

}

/**

* 获取某个对象的主键ID

* @param student

* @return

*/

private long getID(Student student){

return daoSession.getStudentDao().getKey(student);

}

/**

* 通过名字获取Customer对象

* @return

*/

private List getStudentByName(String key){

QueryBuilder queryBuilder = daoSession.getStudentDao().queryBuilder();

queryBuilder.where(CustomerDao.Properties.Name.eq(key));

int size = queryBuilder.list().size();

if (size > 0){

return queryBuilder.list();

}else{

return null;

}

}

/**

* 通过名字获取Customer对象

* @return

*/

private List getIdByName(String key){

List students = getStudentByName(key);

List ids = new ArrayList();

int size = students.size();

if (size > 0){

for (int i = 0;i < size;i++){

ids.add(students.get(i).getId());

}

return ids;

}else{

return null;

}

}

/***************************数据库删除*************************/

/**

* 根据ID进行数据库的删除操作

* @param id

*/

private void deleteById(long id){

daoSession.getStudentDao().deleteByKey(id);

}

/**

* 根据ID同步删除数据库操作

* @param ids

*/

private void deleteByIds(List ids){

daoSession.getStudentDao().deleteByKeyInTx(ids);

}

/***********************************

* 在次添加一些Student特有的数据库操作语句

* ************************************/

}针对不同的数据表可以将一些特有的查询条件放在StudentManager类中(因为不同的数据表可能需要的查询条件不近相同),这样方便查询。

(四)将已创建的多表Manager对象封装在一个类

其具体代码如DaoUtils.java所示。

package com.jamy.DaoUtils;

import android.content.Context;

import android.util.Log;

import com.jamy.dao.CustomerDao;

import com.jamy.dao.DaoSession;

import com.jamy.dao.StudentDao;

import com.jamy.entity.Customer;

import com.jamy.entity.Student;

import java.util.ArrayList;

import java.util.List;

import de.greenrobot.dao.AbstractDao;

import de.greenrobot.dao.query.QueryBuilder;

/**

* Created by jinfangmei on 2016/6/16.

*/

public class DaoUtils{

private static CustomerManager customerManager;

private static StudentManager studentManager;

public static Context context;

public static void init(Context context){

DaoUtils.context = context.getApplicationContext();

}

/**

* 单列模式获取CustomerManager对象

* @return

*/

public static CustomerManager getCustomerInstance(){

if (customerManager == null) {

customerManager = new CustomerManager(context);

}

return customerManager;

}

/**

* 单列模式获取StudentManager对象

* @return

*/

public static StudentManager getStudentInstance(){

if (studentManager == null) {

studentManager = new StudentManager(context);

}

return studentManager;

}

}   上面有一点需注意,由于在DaoUtils中的Context是由static修饰,所以这里的context要用ApplicationContext(防止Activity被结束而造成内存泄漏)。

上面的一步步封装已经完成,下面在MainActivity中调用试试好不好用。哈哈。

MainActivity.java的具体代码如下所示。

package com.jamy.testgreendao;

import android.content.Context;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import com.jamy.DaoUtils.DaoUtils;

import com.jamy.entity.Customer;

import com.jamy.entity.Student;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private Button mAddButton;

public Button mDeleteButton,mUpdateButton,mQueryButton;

private List students;

private List customers;

private Context context;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initView();

DaoUtils.init(MainActivity.this);

}

private void initView() {

customers = new ArrayList();

students = new ArrayList();

mAddButton = (Button) findViewById(R.id.addbutton);

mDeleteButton = (Button) findViewById(R.id.deletebutton);

mUpdateButton = (Button) findViewById(R.id.uodatebutton);

mQueryButton = (Button) findViewById(R.id.queryButton);

mAddButton.setOnClickListener(this);

mDeleteButton.setOnClickListener(this);

mUpdateButton.setOnClickListener(this);

mQueryButton.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()){

case R.id.addbutton:

for (int i=0;i<4;i++){

Student student = new Student();

student.setName("jamy");

student.setAge(110+i);

student.setDepartment("A1113"+i);

students.add(student);

}

for (int i=0;i<4;i++){

Customer customer = new Customer();

customer.setName("jin"+i);

customer.setAddress("shenzhen"+i);

customer.setType("CEO");

customers.add(customer);

}

DaoUtils.getCustomerInstance().insertMultObject(customers);

break;

case R.id.deletebutton:

DaoUtils.getCustomerInstance().deleteByIds(DaoUtils.getCustomerInstance().getIdByName("jin2"));

break;

case R.id.queryButton:

List list = DaoUtils.getCustomerInstance().QueryAll(Customer.class);

for (int i=0;i

Customer customer = list.get(i);

Log.d("JAMY","id:"+customer.getId()+" name:"+customer.getName()

+" Address:"+customer.getAddress()+" Type:"+customer.getType());

}

break;

case R.id.uodatebutton:

Customer customer = new Customer();

customer.setId(1l);

customer.setName("jinfangmei");

customer.setType("CEO");

customer.setAddress("shenzhen0");

DaoUtils.getCustomerInstance().updateObject(customer);

// if (null != customers){

// for (int i=0;i

// Log.d("JAMY",customers.get(i).getId().toString());

// }

// }

// List ids = daoUtils.getIdByKey("jin1");

// Log.d("JAMY",ids.toString());

break;

}

}

@Override

protected void onDestroy() {

super.onDestroy();

DaoUtils.getCustomerInstance().CloseDataBase();

}

}

好了,调用了下,感觉还是不错的。虽说不是很完美,但最起码凑合凑合能用。以上就是鄙人对GreenDao进行的一些简单的封装,知道还不是很完善,希望各位多给批评建议,没有你们的建议就没有我的逐步成长。两篇博客搞定,哈哈。

java basedao 封装,GreenDao的实用封装相关推荐

  1. SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装

    SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>& ...

  2. java如何实现封装_java如何实现封装

    Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法. java封装类通过三个步骤实现: (1)修改属性的可见性,限制访问. (2)设置属性的读取方 ...

  3. Java私有方法运用场景_java6-3 封装和private关键字

    1.  private: 是一个权限修饰符 可以修饰成员变量和成员方法 被其修饰的成员只能在本类中被访问 定义一个学生类: 成员变量:name,age 成员方法:show()方法 2.我们在使用这个案 ...

  4. Java讲课笔记10:类的封装

    文章目录 零.本讲学习目标 1.掌握类的封装 2.学会使用方法的重载 3.学会方法的递归 一.类的封装 1.为什么需要封装 (1)案例演示 (2)案例分析 (3)解决方案 2.如何实现封装 (1)封装 ...

  5. Java自己封装mysql框架_java封装

    jar,war,ear区别及java基础杂七八 jar,war,earqu区别 这三种文件都可以看作是java的压缩格式,其实质是实现了不同的封装: jar--封装类war--封装web站点ear-- ...

  6. java 音频解码_java视频音频解码-封装xuggle-实现多种视频编码格式解码扩展

    手头做一个视频相关项目,但是客户发来的测试视频(avi格式) 现有组件不能解码.现有 视频解码组件方案有基于JMF和opencv Jni调用.远远不能满足目前市面上玲琅满目的各种视频编码 标准. 进行 ...

  7. java类成员和实例成员,面向对象Java实验:实验二 类封装,实例成员与类成员,包...

    面向对象Java实验:实验二 类封装,实例成员与类成员,包 程序1: class Trangle { double sideA,sideB,sideC,area,length; boolean boo ...

  8. Java Hutool 介绍 hutool 工具包 模块 封装 工具

    1.简介 Hutool文档 (很重要) Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以&q ...

  9. Java中的基本类型与封装类型以及自动装箱、拆箱

    Java中的类型分为原始类型和对应的封装类型(装箱类型),基本类型包括byte字节型(一个字节).char字符型(两个字节).short短整型(两个字节).int整型(四个字节).long长整型(八个 ...

最新文章

  1. 自定义 coding.net 静态网站域名
  2. [云炬创业管理笔记]第五章打磨最有效的商业模式测试3
  3. C++总结笔记(十二)—— 智能指针
  4. CoreAnimation编程指南(七)图层Action
  5. python基础教程廖雪峰云-Python3基础教程-廖雪峰[带标签完整版]
  6. VS2008开发中Windows Mobile 5.0 emulator连网的配置
  7. 精品推荐:【CKEditor】全球最优秀的网页在线文字编辑器之一
  8. 断言python_Python 断言
  9. 基于 VIVADO 的 AM 调制解调(2)工程实现
  10. android写出资源文件,Android 读取Assets下的资源文件
  11. 总结——硬件工程师面试容易碰到的问题
  12. (doc, docx)文档合并的三种方法
  13. Python 处理Excel内的数据(案例介绍*2)
  14. iOS公司开发者账号申请详细教程
  15. 腾讯技术工程 | 透过新硬件环境下的存储技术,看未来数据库系统崛起(附PPT)...
  16. 记一次计算机课作文,关于记一次课堂游戏作文(精选5篇)
  17. 计算机统计分析spss试卷,《SPSS計算机统计分析方法》试卷A卷.doc
  18. 【手撕AHB-APB Bridge】~ AMBA总线 之 APB
  19. 二是方便其“飞鸽下载”人看
  20. 由力扣K 个一组翻转链表到360原创题

热门文章

  1. (面试智力题)3ml 5ml 杯子各一个,拼出 4ml 的容量。
  2. 每天一点数据库之-----Day 6 数据分组与数据分页
  3. 论文阅读及神经网络学习----Neural Networks for Multi-Instance Learning
  4. 信息化基础建设 里程碑
  5. mysql查看数据库时区CST
  6. 2020,金融科技强监管元年
  7. 2019-9月份末论文: Break it down into text and timbre and accent factors, 主要为了跨语言voice clone
  8. led3mm和5mm区别 共阳5mm发光二极管参数
  9. IDEA GridLayout
  10. NXP Support Package S32K1xx 安装