GreenDao学习
来源:互联网 发布:wps2009筛选重复数据 编辑:程序博客网 时间:2024/06/09 14:18
GreenDao学习
官网:http://greenrobot.org/greendao/
ORM: object Relationnal Mapping,即关系对象映射,他的思想就是将关系数据库中表的数据映射成对象,以对象的形式呈现,这样开发人员就可以将数据的操作转化为对象的操作,。因此它的目的是方便开发人员以面向对象的思想实现数据库的操作
一、GreenDao是什么?
GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣。它减轻开发人员处理低级数据库需求,同时节省开发时间。 SQLite是一个令人敬畏的内嵌的关系数据库,编写SQL和解析查询结果是相当乏味和耗时的任务。通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),GreenDAO可以将它们从这些映射中释放出来,这样,您可以使用简单的面向对象的API来存储,更新,删除和查询数据库。
简单的讲,GreenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
二、greenDAO’s Features at a glance(GreenDao优点)
Maximum performance(最优性能): (probably the fastest ORM for Android); our benchmarks are open sourced too
Easy to use(便于使用): powerful APIs covering relations and joins
Minimal(低消耗): memory consumption
Small(空间小): library size (<100KB) to keep your build times low and to avoid the 65k method limit
Database encryption(数据加密): greenDAO supports SQLCipher to keep your user’s data safe
Strong community(强壮的社区): More than 5.000 GitHub stars show there is a strong and active community
三、GreenDao配置
1、添加依赖
①In your root build.gradle file:
buildscript { repositories { jcenter() mavenCentral() // add repository } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin }}
②In your app projects build.gradle file:
apply plugin: 'com.android.application'apply plugin: 'org.greenrobot.greendao' // apply plugingreendao { schemaVersion 1 daoPackage '包名.gen' targetGenDir 'src/main/java'} dependencies { compile 'org.greenrobot:greendao:3.2.2' // add library}
schemaVersion:指定数据库schema版本号,迁移等操作会用到;
daoPackage:通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名;
targetGenDir:自定义生成数据库文件的目录,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了。
2、通过GreenDao3注解的语法来定义我们的一个数据库实体类及其数据库操作方法
@Entitypublic class User{ @Id(autoincrement = true) private Long _id; private String name; @NotNull private String age;}
这里的几个注解含义:
- @Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类;
- @nameInDb:在数据库中的名字,如不写则为实体中类名;
- @Id:选择一个long / Long属性作为实体ID。 在数据库方面,它是主键。 参数autoincrement是设置ID值自增;
- @NotNull:使该属性在数据库端成为“NOT
NULL”列。 通常使用@NotNull标记原始类型(long,int,short,byte)是有意义的 - @Transient:表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化。
3、通过点击AndroidStudio中的MakeProject,便发现GreenDao为我们的Meizi实体类生成了对应的Getter、Setter方法以及俩个构造函数,同时在我们配置的com.ping.greendao.gen包下生成了三个对应类文件DaoMaster、DaoSession和MeiziDao,之后所有相关的数据库操作都依靠这三个文件了;
DaoMaster:使用greenDAO的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。 它具有静态方法来创建表或将它们删除。 其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。一个DaoMaster就代表着一个数据库的连接。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取。 DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。 DaoSession可以让我们使用一些Entity的基本操作和获取Dao操作类,DaoSession可以创建多个,每一个都是属于同一个数据库连接的。
XxxDAO:数据访问对象(DAO)持续存在并查询实体。 对于每个实体,GreenDAO生成一个DAO。 它比DaoSession有更多的持久化方法,例如:count,loadAll和insertInTx。
4、编写DaoManager,用于创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级
/** * Created by anwanfei on 2017/8/4. * 创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级 */public class DaoManager { private static final String TAG = DaoManager.class.getSimpleName(); private static final String DB_NAME = "shipDetails"; private Context context; //多线程中要被共享的使用volatile关键字修饰 private volatile static DaoManager manager = new DaoManager(); private static DaoMaster sDaoMaster; private static DaoMaster.DevOpenHelper sHelper; private static DaoSession sDaoSession; /** * 单例模式获得操作数据库对象 * * @return */ public static DaoManager getInstance() { return manager; } public void init(Context context) { this.context = context; } /** * 判断是否有存在数据库,如果没有则创建 * * @return */ public DaoMaster getDaoMaster() { if (sDaoMaster == null) { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null); sDaoMaster = new DaoMaster(helper.getWritableDatabase()); } return sDaoMaster; } /** * 完成对数据库的添加、删除、修改、查询操作,仅仅是一个接口 * * @return */ public DaoSession getDaoSession() { if (sDaoSession == null) { if (sDaoMaster == null) { sDaoMaster = getDaoMaster(); } sDaoSession = sDaoMaster.newSession(); } return sDaoSession; } /** * 打开输出日志,默认关闭 */ public void setDebug() { QueryBuilder.LOG_SQL = true; QueryBuilder.LOG_VALUES = true; } /** * 关闭所有的操作,数据库开启后,使用完毕要关闭 */ public void closeConnection() { closeHelper(); closeDaoSession(); } public void closeHelper() { if (sHelper != null) { sHelper.close(); sHelper = null; } } public void closeDaoSession() { if (sDaoSession != null) { sDaoSession.clear(); sDaoSession = null; } }}
5 、编写XxxDaoUtil,用于完成对某一张数据表的具体操作——ORM操作
/** * Created by anwanfei on 2017/8/4. */public class ShipDetailsDaoUtil { private static final String TAG = ShipDetailsDaoUtil.class.getSimpleName(); private DaoManager mManager; public ShipDetailsDaoUtil(Context context) { mManager = DaoManager.getInstance(); mManager.init(context); } /** * 完成ShipDetailsBean记录的插入,如果表未创建,先创建ShipDetailsBean表 * * @param ShipDetailsBean * @return */ public boolean insertShipDetailsBean(ShipDetailsBean ShipDetailsBean) { boolean flag = false; flag = mManager.getDaoSession().getShipDetailsBeanDao().insert(ShipDetailsBean) == -1 ? false : true; Log.i(TAG, "insert ShipDetailsBean :" + flag + "-->" + ShipDetailsBean.toString()); return flag; } /** * 插入多条数据,在子线程操作 * * @param ShipDetailsBeanList * @return */ public boolean insertMultShipDetailsBean(final List<ShipDetailsBean> ShipDetailsBeanList) { boolean flag = false; try { mManager.getDaoSession().runInTx(new Runnable() { @Override public void run() { for (ShipDetailsBean ShipDetailsBean : ShipDetailsBeanList) { mManager.getDaoSession().insertOrReplace(ShipDetailsBean); } } }); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 修改一条数据 * * @param ShipDetailsBean * @return */ public boolean updateShipDetailsBean(ShipDetailsBean ShipDetailsBean) { boolean flag = false; try { mManager.getDaoSession().update(ShipDetailsBean); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 删除单条记录 * * @param ShipDetailsBean * @return */ public boolean deleteShipDetailsBean(ShipDetailsBean ShipDetailsBean) { boolean flag = false; try { //按照id删除 mManager.getDaoSession().delete(ShipDetailsBean); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 删除所有记录 * * @return */ public boolean deleteAll() { boolean flag = false; try { //按照id删除 mManager.getDaoSession().deleteAll(ShipDetailsBean.class); flag = true; } catch (Exception e) { e.printStackTrace(); } return flag; } /** * 查询所有记录 * * @return */ public List<ShipDetailsBean> queryAllShipDetailsBean() { return mManager.getDaoSession().loadAll(ShipDetailsBean.class); } /** * 根据主键id查询记录 * * @param key * @return */ public ShipDetailsBean queryShipDetailsBeanById(long key) { return mManager.getDaoSession().load(ShipDetailsBean.class, key); } /** * 使用native sql进行查询操作 */ public List<ShipDetailsBean> queryShipDetailsBeanByNativeSql(String sql, String[] conditions) { return mManager.getDaoSession().queryRaw(ShipDetailsBean.class, sql, conditions); } /** * 使用queryBuilder进行查询 * * @return */ public List<ShipDetailsBean> queryShipDetailsBeanByQueryBuilder(String id) { QueryBuilder<ShipDetailsBean> queryBuilder = mManager.getDaoSession().queryBuilder(ShipDetailsBean.class); return queryBuilder.where(ShipDetailsBeanDao.Properties.ShipName.eq(id)).list(); } /** * 模糊查询 * * @param value * @return */ public List<ShipDetailsBean> getCarsByLike(String value) { return mManager.getDaoSession().queryBuilder(ShipDetailsBean.class).where(ShipDetailsBeanDao.Properties.ShipName.like("%" + value + "%")).list(); }} /** * 多条件模糊查询 * * @param value * @return */ public List<ShipDetailsBean> getShipsByLike(String value) { return mManager.getDaoSession().queryBuilder(ShipDetailsBean.class) .whereOr(ShipDetailsBeanDao.Properties.ShipName.like("%" + value + "%"), ShipDetailsBeanDao.Properties.Mmsi.like("%" + value + "%")).list(); }
三、代码中调用XXXUtils进行增删改查
①单个插入操作: mUserDaoUtils.insertMeizi(new User(null, "an","28"));
②批量插入操作:
List<User> users= new ArrayList<>();users.add(new User(null, "an","28"));users.add(new User(null, "an","28"));users.addnew User(null, "an","28"));mUserDaoUtils.insertMultUser(users);
③单个更改操作:(其中原有的数据都不会保存,如果新建的对象有属性没有设置,则会为空,不为空的字段没有设置,则报错)
User user= new User();user.set_id(1002l);user.setName("fei");mUserDaoUtils.updateUser(user);
④删除某条记录操作
User user= new User();user.set_id(1002l);mUserDaoUtils.deleteUser(user);
⑤删除所有记录操作
mUserDaoUtils.deleteAll();
⑥查询所有记录
mUserDaoUtils.queryMeiziById(1008l).toString();
⑦根据主键查询记录
List<User> UserList = mUserDaoUtils.queryAllMeizi();
⑧各种条件查询:使用native sql进行条件查询:
String sql = "where _id > ?";String[] condition = new String[]{"1008"};List<User> UserList = mUserDaoUtils.queryUsrByNativeSql(sql, condition);
⑨使用queryBuilder进行条件查询
QueryBuilder能够让你在不涉及SQL语句的情况下查询实体。写SQL有几个缺点,首先是易错的,其次是要在运行时才知道有没有问题(假如属性名是pid,你写成了id,也要到运营时才会崩溃),QueryBuilder能够在编译时检查错误(如属性的引用是否错误)。 关于Api:在org.greenrobot.greendao.query包下,QueryBuilder类中查看其方法;构造函数可以传递我们的Xxx实体类型,查询方法有很多逻辑的where方法。where方法中需要设置WhereCondition类型的条件参数,而在org.greenrobot.greendao包下的Property类中,每一种操作符的方法都返回WhereCondition类型。获取Property实例则不需要我们去做,在我们的XxxDao中已经有对应的提供,例如我们这里的MeiziDao.Properties.XXX。
List<User> UserList = mUserDaoUtils.queryMeiziByQueryBuilder(1008);
LazyList懒加载是指一次性查完数据保存在内存中,然后关闭所有连接,再次查询时从内存中获取。一般查询大数据量时用。
三、参考:http://blog.csdn.net/bskfnvjtlyzmv867/article/details/71250101
- greenDao学习
- GreenDao 学习
- GreenDao学习
- GreenDao学习
- GreenDao 学习笔记 1
- GreenDao 学习笔记 1
- GreenDao 学习笔记 2
- GreenDao 学习笔记 3
- GreenDao 学习笔记 4
- GreenDao 学习笔记 5
- GreenDao 学习笔记 6
- GreenDao 学习笔记 7
- GreenDao源码学习
- greenDAO学习笔记
- greenDAO学习分享总结
- GreenDao学习备份
- GreenDao学习历程01
- GreenDAO 学习笔记
- 前端常用网站
- 求次数
- Eclipse Oxygen集成的Gradle的使用
- java读取xml
- J2ME开发新手九大入门要点
- GreenDao学习
- HDU6076(dp+记忆化搜索+hash)
- mapreduce程序本地模式调试
- JVM内存模型
- jquery动态调整div大小使其宽度始终为浏览器宽度
- 标准I/O:分别用fgetc与fputc,fgets与fputs,fread与fwrite实现文件的复制
- Size数据结构 Point类
- 遍历指定路径下的文件
- 爱剪辑的入门使用体验