java basedao 封装,GreenDao的实用封装
前面简单介绍了下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的实用封装相关推荐
- SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装
SpringJdbc持久层封装,Spring jdbcTemplate封装,springJdbc泛型Dao,Spring baseDao封装 >>>>>>>& ...
- java如何实现封装_java如何实现封装
Java中类的封装是如何实现的封装是将对象的信息隐藏在对象内部,禁止外部程序直接访问对象内部的属性和方法. java封装类通过三个步骤实现: (1)修改属性的可见性,限制访问. (2)设置属性的读取方 ...
- Java私有方法运用场景_java6-3 封装和private关键字
1. private: 是一个权限修饰符 可以修饰成员变量和成员方法 被其修饰的成员只能在本类中被访问 定义一个学生类: 成员变量:name,age 成员方法:show()方法 2.我们在使用这个案 ...
- Java讲课笔记10:类的封装
文章目录 零.本讲学习目标 1.掌握类的封装 2.学会使用方法的重载 3.学会方法的递归 一.类的封装 1.为什么需要封装 (1)案例演示 (2)案例分析 (3)解决方案 2.如何实现封装 (1)封装 ...
- Java自己封装mysql框架_java封装
jar,war,ear区别及java基础杂七八 jar,war,earqu区别 这三种文件都可以看作是java的压缩格式,其实质是实现了不同的封装: jar--封装类war--封装web站点ear-- ...
- java 音频解码_java视频音频解码-封装xuggle-实现多种视频编码格式解码扩展
手头做一个视频相关项目,但是客户发来的测试视频(avi格式) 现有组件不能解码.现有 视频解码组件方案有基于JMF和opencv Jni调用.远远不能满足目前市面上玲琅满目的各种视频编码 标准. 进行 ...
- java类成员和实例成员,面向对象Java实验:实验二 类封装,实例成员与类成员,包...
面向对象Java实验:实验二 类封装,实例成员与类成员,包 程序1: class Trangle { double sideA,sideB,sideC,area,length; boolean boo ...
- Java Hutool 介绍 hutool 工具包 模块 封装 工具
1.简介 Hutool文档 (很重要) Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以&q ...
- Java中的基本类型与封装类型以及自动装箱、拆箱
Java中的类型分为原始类型和对应的封装类型(装箱类型),基本类型包括byte字节型(一个字节).char字符型(两个字节).short短整型(两个字节).int整型(四个字节).long长整型(八个 ...
最新文章
- 黑盒测试方法之等价类划分法
- 服务器中加速BIOS启动的方法
- javascritp笔记1
- 操作系统:Android(Google公司开发的操作系统)
- oracle最新scn补丁,更新:Oracle全面修正了关于DB Link和SCN补丁的公告
- CSS之使用display:inline-block布局
- 智源-计算所虚假新闻检测大赛 | 探秘假新闻中的视觉信息
- ComboBox 强制转换为大写的方法
- android 设置资源,Android 资源
- bootstrap+masonry.js写瀑布流
- 3.2 指数型生成函数
- 一道贪心:加括号使算式的值最大
- 图解25匹马的选马问题
- 库没启动,报:ORA-01034: ORACLE not available
- kubernetes Ingress是什么
- 【python数据分析】亚太地区的商学院(商务与经济统计案例3-3)数据分析
- 串联滞后校正网络的作用_以下关于串联滞后校正的描述正确的是( )。
- 渗透之——触发Easy File Sharing Web Server 7.2 HEAD缓冲区溢出的Python脚本
- 【安装配置】DirectAdmin安装Nginx方法
- docker image 重命名
热门文章
- elementui 表单v-molde是动态的,校验表单字段为必填项
- 未闻花名怎么用计算机,未闻花名(我们仍未知道那天所看见的花的名字)攻略...
- 南卡和索尼蓝牙耳机哪个好?两款高性价比音质蓝牙耳机对比测评
- NER解决方案——NN-CRF
- 国家数据局成立将带来大数据的五个发展趋势
- Westcar液力耦合器易熔塞-WESTCAR限矩型液力偶合器的过载保护装置
- 往Oracel数据库批量插入数据
- Java打怪兽小游戏
- weblogic Rejecting request since max request parameter limit exceeded 10000
- Matlab 两种比较三个数的大小