博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android数据存储之GreenDao 3.0 详解
阅读量:4074 次
发布时间:2019-05-25

本文共 6445 字,大约阅读时间需要 21 分钟。

前言:

 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite---->OrmLite---->GreenDao。今天白天一直在忙着公司的项目需求,只能晚上加班来学习最新的GreenDao 3.0使用方式了。

GreenDao 介绍:

    greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操作关系型数据库,它能够让你操作数据库时更简单、更方便。如下图所示:

官网地址:http://greenrobot.org/greendao/

github:https://github.com/greenrobot/greenDAO

GreenDao 优点:

  • 性能高,号称Android最快的关系型数据库

  • 内存占用小
  • 库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制

  • 支持数据库加密  greendao支持SQLCipher进行数据库加密 有关SQLCipher可以参考这篇博客

  • 简洁易用的API

GreenDao 3.0改动:

   使用过GreenDao的同学都知道,3.0之前需要通过新建GreenDaoGenerator工程生成Java数据对象(实体)和DAO对象,非常的繁琐而且也加大了使用成本。

GreenDao  3.0最大的变化就是采用注解的方式通过编译方式生成Java数据对象和DAO对象。

GreenDao 3.0使用方式:

 1.)在build.gradle添加如下配置
buildscript {    repositories {        mavenCentral()    }    dependencies {        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'    }}apply plugin: 'org.greenrobot.greendao'dependencies {    compile 'org.greenrobot:greendao:3.0.1'}
2.)新建实体
@Entitypublic class User {    @Id    private Long id;    private String name;    private int age;   //下面省去了 setter/getter}

此时编译一下自动生成DaoMaster 、DaoSession、Dao,如图所示 默认位置:

3.)Gradle 插件配置

比如上面想指定生成DaoMaster 、DaoSession、Dao位置

greendao {    targetGenDir 'src/main/java'}
  • schemaVersion: 数据库schema版本,也可以理解为数据库版本号
  • daoPackage:设置DaoMaster 、DaoSession、Dao包名
  • targetGenDir:设置DaoMaster 、DaoSession、Dao目录
  • targetGenDirTest:设置生成单元测试目录
  • generateTests:设置自动生成单元测试用例
4.)实体@Entity注解
  • schema:告知GreenDao当前实体属于哪个schema
  • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
  • nameInDb:在数据中使用的别名,默认使用的是实体的类名
  • indexes:定义索引,可以跨越多个列
  • createInDb:标记创建数据库表
5.)基础属性注解
  • @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
  • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
  • @NotNul:设置数据库表当前列不能为空
  • @Transient :添加次标记之后不会生成数据库表的列
6.)索引注解
  • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
  • @Unique:向数据库列添加了一个唯一的约束
7.)关系注解
  • @ToOne:定义与另一个实体(一个实体对象)的关系
  • @ToMany:定义与多个实体对象的关系

GreenDao 3.0简单实战:

      1.)通过上面使用方式我们可以获取DaoMaster 、DaoSession、Dao类

 这里声明一个数据库管理者单例

public class DBManager {    private final static String dbName = "test_db";    private static DBManager mInstance;    private DaoMaster.DevOpenHelper openHelper;    private Context context;    public DBManager(Context context) {        this.context = context;        openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);    }    /**     * 获取单例引用     *     * @param context     * @return     */    public static DBManager getInstance(Context context) {        if (mInstance == null) {            synchronized (DBManager.class) {                if (mInstance == null) {                    mInstance = new DBManager(context);                }            }        }        return mInstance;    }}
2.)获取可读可写数据库

  可读数据库

/**     * 获取可读数据库     */    private SQLiteDatabase getReadableDatabase() {        if (openHelper == null) {            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);        }        SQLiteDatabase db = openHelper.getReadableDatabase();        return db;    }

   可写数据库

/**     * 获取可写数据库     */    private SQLiteDatabase getWritableDatabase() {        if (openHelper == null) {            openHelper = new DaoMaster.DevOpenHelper(context, dbName, null);        }        SQLiteDatabase db = openHelper.getWritableDatabase();        return db;    }
3.)插入数据
/**     * 插入一条记录     *     * @param user     */    public void insertUser(User user) {        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());        DaoSession daoSession = daoMaster.newSession();        UserDao userDao = daoSession.getUserDao();        userDao.insert(user);    }    /**     * 插入用户集合     *     * @param users     */    public void insertUserList(List
users) { if (users == null || users.isEmpty()) { return; } DaoMaster daoMaster = new DaoMaster(getWritableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); userDao.insertInTx(users); }
4.)删除数据
/**     * 删除一条记录     *     * @param user     */    public void deleteUser(User user) {        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());        DaoSession daoSession = daoMaster.newSession();        UserDao userDao = daoSession.getUserDao();        userDao.delete(user);    }
5.)更新数据
/**     * 更新一条记录     *     * @param user     */    public void updateUser(User user) {        DaoMaster daoMaster = new DaoMaster(getWritableDatabase());        DaoSession daoSession = daoMaster.newSession();        UserDao userDao = daoSession.getUserDao();        userDao.update(user);    }
6.)查询数据
/**     * 查询用户列表     */    public List
queryUserList() { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); QueryBuilder
qb = userDao.queryBuilder(); List
list = qb.list(); return list; } /** * 查询用户列表 */ public List
queryUserList(int age) { DaoMaster daoMaster = new DaoMaster(getReadableDatabase()); DaoSession daoSession = daoMaster.newSession(); UserDao userDao = daoSession.getUserDao(); QueryBuilder
qb = userDao.queryBuilder(); qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age); List
list = qb.list(); return list; }
7.)测试程序
DBManager dbManager = DBManager.getInstance(this);        for (int i = 0; i < 5; i++) {            User user = new User();            user.setId(i);            user.setAge(i * 3);            user.setName("第" + i + "人");            dbManager.insertUser(user);        }        List
userList = dbManager.queryUserList(); for (User user : userList) { Log.e("TAG", "queryUserList--before-->" + user.getId() + "--" + user.getName() +"--"+user.getAge()); if (user.getId() == 0) { dbManager.deleteUser(user); } if (user.getId() == 3) { user.setAge(10); dbManager.updateUser(user); } } userList = dbManager.queryUserList(); for (User user : userList) { Log.e("TAG", "queryUserList--after--->" + user.getId() + "---" + user.getName()+"--"+user.getAge()); }

运行结果

 

总结:

   本文主要介绍了GreenDao 3.0使用注解的情况,以及实现了简单的增删改查,接下来会更一步学习GreenDao更为复杂的使用的方式。

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

转载地址:http://nquni.baihongyu.com/

你可能感兴趣的文章
github简单使用教程
查看>>
如何高效利用GitHub
查看>>
环境分支-git版本管理
查看>>
uni-app 全局变量
查看>>
java 不用递归写tree
查看>>
springboot2 集成Hibernate JPA 用 声明式事物
查看>>
fhs-framework jetcache 缓存维护之自动清除缓存
查看>>
SpringBoot 动态编译 JAVA class 解决 jar in jar 的依赖问题
查看>>
fhs-framework springboot mybatis 解决表关联查询问题的关键方案-翻译服务
查看>>
ZUUL2 使用场景
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
支付宝生活号服务号 用户信息获取 oauth2 登录对接 springboot java
查看>>
CodeForces #196(Div. 2) 337D Book of Evil (树形dp)
查看>>
uva 12260 - Free Goodies (dp,贪心 | 好题)
查看>>
uva-1427 Parade (单调队列优化dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>