技术共享之数据库框架GreenDao的使用以及二次封装
来源:互联网 发布:安卓手机视频录像软件 编辑:程序博客网 时间:2024/05/19 23:27
greendao 框架是一款ORM 数据库框架,ORM也就是对象关系映射。 相比其他数据库框架与原生的sql语句相比 好处:1、一个精简的库 2、性能最大化 3、内存开销最小化 4、易于使用的 APIs 5、对 Android 进行高度优化
DaoSession :会话层。操作具体的Dao 对象。提供了基本的持久化方法,比如对实体对 象的insert 、load、update、refresh、还有delete 等等。
XXDao :实际生成的Dao类 通常对应具体的Java类,greendao 为每 一个实体创建一个Dao,她提供DaoSession更具体的方法,比如count ,loadAll, 和insertInTx(支持批量插入)
步入正题
第一步 ,开始配置 greendao
1. 在工程(project.gradle)的gradle 中 添加 classpath
buildscript { repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}
- 在app.gradle 中添加
apply plugin: 'org.greenrobot.greendao'
greendao { schemaVersion 1 //schema版本 daoPackage 'com.liang.boke.GreenDao.gen' //包名 targetGenDir 'src/main/java' //目录文件夹 }
compile'org.greenrobot:greendao:3.0.1' compile'org.greenrobot:greendao-generator:3.0.0'
第二步、写实体类
新建实体类,里面包括要数据库表中的键 ,这些greendao 都会在数据库中帮我们完成
@Entitypublic class UserInfo { @Id(autoincrement = true) private Long _id ; private String name ; private String age ; private String address ; }
写完实体类之后 ctrl + F9 (rebuilder) 这时 greendao 会自动在实体类中帮我们生成 get 和 set 方法
也会在对应的 你自己在 app.gradle 中配置的 greendao{ } 中 对应的包中 生成对应的DaoMaster DaoSession XXXDao
以上就完成了对greendao 的基本配置
接下来要做的就是 对 greendao 进行二次封装
第三步 新建一个类 DaoManager.java
此类用来对数据库的创建 创建表 ,更新数据库
package com.liang.boke.GreenDao.gen.DaoManager;import android.content.Context;import com.liang.boke.GreenDao.gen.DaoMaster;import com.liang.boke.GreenDao.gen.DaoSession;import com.liang.boke.GreenDao.gen.UserInfo;import org.greenrobot.greendao.query.QueryBuilder;/** * Created by 梁 on 2017/12/7. */public class DaoManager { private static final String DB_NAME = "Greendao.sqlite"; private static final String TAG = DaoManager.class.getSimpleName(); private static volatile DaoManager daoManager ; //多线程 使用单例模式 private static DaoMaster daoMaster ; private static DaoSession daoSession ; private static DaoMaster.DevOpenHelper helper ; private Context context ; /* * 使用单例模式 保证数据库的安全 * */ public static DaoManager getInstance(){ DaoManager instance = null ; if(daoManager == null) { synchronized (UserInfo.class) { if(instance == null) { instance = new DaoManager(); } daoManager = instance ; } } return daoManager ; } /* * 初始化daomanager * */ public void init(Context context){ this.context = context ; } /** * 判断是否存在数据库,如果没有则创建数据库 * @return */ public DaoMaster getDaoMaster(){ if(daoMaster == null) { helper = new DaoMaster.DevOpenHelper(context,DB_NAME,null); daoMaster =new DaoMaster(helper.getWritableDatabase()); } return daoMaster ; } /** * 完成对数据库的添加 修改 查询 的操作 仅仅是一个接口 * @return */ public DaoSession getDaoSession(){ if(daoSession == null) { if(daoMaster == null) { daoMaster = getDaoMaster() ; } daoSession = daoMaster.newSession(); } return daoSession ; } /* * 是否打印 数据库的日志信息 默认不开启 * */ public void setDebug(Boolean isDebug){ if(isDebug) { QueryBuilder.LOG_SQL =true ; QueryBuilder.LOG_VALUES = true ; } else { QueryBuilder.LOG_SQL =true ; QueryBuilder.LOG_VALUES = true ; } } /* * 关闭 help * */ public void closeHelper(){ if(helper != null) { helper.close(); helper = null ; } } /* * 关闭 会话 * */ public void closeSession(){ if(daoSession != null) { daoSession.clear(); daoSession = null ; } } /* * 关闭所有的操作 数据库用完的时候必须关闭 节省资源 */ public void closeConnection(){ closeHelper(); closeSession(); }}
第四步、 新建一个DbUtil 类 用来对 数据库的增删改查方法进行封装
package com.liang.boke.GreenDao.gen.Common;import android.content.Context;import android.content.Entity;import com.liang.boke.GreenDao.gen.DaoManager.DaoManager;import com.liang.boke.GreenDao.gen.DaoSession;import com.liang.boke.GreenDao.gen.UserInfo;import com.liang.boke.GreenDao.gen.UserInfoDao;import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;/** * Created by 梁 on 2017/12/7. */public class DbUtil { private DaoManager daoManager ; /* * 构造方法 初始化daoManager * */ public DbUtil(Context context) { daoManager =DaoManager.getInstance(); daoManager.init(context); } /* * 插入一条数据对象 * */ public Boolean insertUser(UserInfo userInfo){ boolean flag = false ; try{ daoManager.getDaoSession().insert(userInfo); flag = true ; }catch (Exception e) { e.getStackTrace(); } return flag ; } /* * 插入多条数据对象 * 可能会存在耗时 操作 所以new 一个线程 * */ public Boolean insertMultUser(final List<UserInfo> userInfos){ boolean flag = false ; try{ daoManager.getDaoSession().runInTx(new Runnable() { @Override public void run() { for (UserInfo userInfo :userInfos) { daoManager.getDaoSession().insert(userInfo); } } }); flag = true ; }catch (Exception e) { e.getStackTrace(); } return flag ; } /* * 修改一条数据 * 根据id 修改 * */ public boolean upDateUser(UserInfo userInfo){ boolean flag = false ; try{ daoManager.getDaoSession().update(userInfo); flag = true ; }catch (Exception e) { e.getStackTrace(); } return flag ; } /* * 删除一条数据 * 根据_id 删除 * */ public boolean deleteUser(UserInfo userInfo){ boolean flag = false ; try{ daoManager.getDaoSession().delete(userInfo); flag = true ; }catch (Exception e) { e.getStackTrace(); } return flag ; } /* * 查询数据 * * *////////返回多条数据 public List<UserInfo> listAll(){ return daoManager.getDaoSession().loadAll(UserInfo.class); } ///////返回单条数据 /** * 根据id 返回userinfo 对象 * @param key id * @return */ public UserInfo listAll(long key){ return daoManager.getDaoSession().load(UserInfo.class,key); } ///////////////强大的querybuilder////////////// /* * 可以自己封装 查询条件 * 返回 userinfo 对象集合 * */ public List<UserInfo> query(){ QueryBuilder<UserInfo> builder = daoManager.getDaoSession().queryBuilder(UserInfo.class); List<UserInfo> lists = builder.where(UserInfoDao.Properties._id.ge(001))// .where() //where 使用的 逻辑与 相当于 数据库中的 and// .where()// .whereOr() //.whereOr() 使用的 逻辑 或 相当于 数据库中的 or .list(); return lists ; }}
最后就是如何使用这些已经封装好的数据库util 了
布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.liang.boke.GreenDao.MainActivity"> <android.support.v7.widget.AppCompatButton android:layout_marginTop="10dp" android:id="@+id/btn_insertOne" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="插入一条数据" /> <android.support.v7.widget.AppCompatButton android:layout_marginTop="10dp" android:id="@+id/btn_insertMulti" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="插入多条数据" /> <android.support.v7.widget.AppCompatButton android:layout_marginTop="10dp" android:id="@+id/btn_update" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="更新一条数据" /> <android.support.v7.widget.AppCompatButton android:layout_marginTop="10dp" android:id="@+id/btn_query" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查询" /></LinearLayout>
在MainActivity 中实现方法
package com.liang.boke.GreenDao;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.AppCompatButton;import android.view.View;import com.liang.boke.GreenDao.gen.Common.DbUtil;import com.liang.boke.GreenDao.gen.UserInfo;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private AppCompatButton mInsertOne; private AppCompatButton mInsertMulti; private AppCompatButton mUpdate; private AppCompatButton mQuery; private AppCompatButton mDelete; private DbUtil dbUtil; private List<UserInfo> userInfos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); initListener(); } private void initUI() { mInsertOne = (AppCompatButton) findViewById(R.id.btn_insertOne); mInsertMulti = (AppCompatButton) findViewById(R.id.btn_insertMulti); mUpdate = (AppCompatButton) findViewById(R.id.btn_update); mDelete = (AppCompatButton) findViewById(R.id.btn_delete); mQuery = (AppCompatButton) findViewById(R.id.btn_query); dbUtil = new DbUtil(this); userInfos = new ArrayList<>(); } private void initListener() { mInsertOne.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserInfo userInfo = new UserInfo(); userInfo.set_id((long) 001); userInfo.setName("张三"); userInfo.setAge("20"); userInfo.setAddress("淮北市"); dbUtil.insertUser(userInfo); } }); mInsertMulti.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { for (int i = 1 ; i <= 10 ; i ++) { UserInfo userInfo = new UserInfo(); userInfo.set_id((long)001+i); userInfo.setName("李四"+ i); userInfo.setAge("20" + i); userInfo.setAddress("淮北" + i); userInfos.add(userInfo) ; } dbUtil.insertMultUser(userInfos); } }); mUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserInfo userInfo = new UserInfo() ; //更改数据 以 _id userInfo.set_id((long) 001); userInfo.setName("更新"); userInfo.setAge("100"); userInfo.setAddress("香港"); dbUtil.upDateUser(userInfo) ; } }); mDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { UserInfo userInfo = new UserInfo() ; userInfo.set_id((long) 002); dbUtil.deleteUser(userInfo); } }); }}
插入一条数据
插入多条数据
更新第一条数据
删除第二条数据
查询 _id 大于 001 的集合对象 数量
以上是对greendao 数据库框架的基本使用 有不足的欢迎提出来,源码已经上传到 http://download.csdn.net/download/baidu_38477614/10149691
有问题可以直接留言,也可以+Q 1915528523
如需转载请标明出处,谢谢。。
- 技术共享之数据库框架GreenDao的使用以及二次封装
- AlamofireObjectMapper框架的基本使用以及二次封装
- GreenDao数据库框架的使用
- OkHttp的基本使用以及二次封装
- 数据库之greenDAO 的使用
- Android数据库框架GreenDao封装使用,易理解、易扩展
- Android开源:数据库ORM框架GreenDao封装工具类使用
- ORMLite 数据库的使用--二次封装
- 数据库框架之GreenDao
- greenDao 数据库框架 使用
- 【Android - 框架】之GreenDao的使用
- Android框架之Greendao 3.0的使用
- Volley框架的二次封装
- Volley框架的二次封装
- Android数据库之greendao的基本使用
- Android GreenDao数据库框架使用
- 使用ORM数据库框架greenDao
- 【开发框架】GreenDao数据库框架的搭建和使用
- qdpm8.0中文翻译文件
- UIAlertController,取代UIAlertView和UIActionSheet
- ICMP类型
- 数据结构实验之图论九:最小生成树
- 定义一个图形类及其子类(三角形类和矩形类),分别计算其面积和周长
- 技术共享之数据库框架GreenDao的使用以及二次封装
- python利用opencv标注bounding box
- 《Appium学习中遇到的问题》之“运行脚本时driver = new AndroidDriver(new URL(serverURL), capabilities)报错”
- FreeSWITCH核心命令
- Spark高级数据分析
- Incorrect integer value(1366)错误解决方法
- JDK 9 发布仅数月,为何在生产环境中却频遭嫌弃?
- java基础—如何创建线程?如何保证线程安全?
- angularJs中service的三种方法以及区别(factory,service,provider三者的区别)