zoukankan      html  css  js  c++  java
  • Android数据存储之GreenDao 3.0 详解

     今天一大早收到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可以参考这篇博客Android数据存储之Sqlite采用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.)新建实体
    @Entity
    public 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<User> 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<User> queryUserList() {
            DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            UserDao userDao = daoSession.getUserDao();
            QueryBuilder<User> qb = userDao.queryBuilder();
            List<User> list = qb.list();
            return list;
        }
    
        /**
         * 查询用户列表
         */
        public List<User> queryUserList(int age) {
            DaoMaster daoMaster = new DaoMaster(getReadableDatabase());
            DaoSession daoSession = daoMaster.newSession();
            UserDao userDao = daoSession.getUserDao();
            QueryBuilder<User> qb = userDao.queryBuilder();
            qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Age);
            List<User> 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<User> 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更为复杂的使用的方式。

    干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!
     
  • 相关阅读:
    学习进度 -- 2019.6.20
    剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)
    剑指Offer的学习笔记(C#篇)-- 二叉树的深度(详讲递归)
    剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数
    if-else判断语句中经常犯的一个错误
    剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
    二叉树遍历基础 -- 递归与非递归的实现方法
    剑指Offer的学习笔记(C#篇)-- 序列化二叉树
    剑指Offer的学习笔记(C#篇)-- 对称的二叉树
    剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7490621.html
Copyright © 2011-2022 走看看