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更为复杂的使用的方式。

    干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!
     
  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7490621.html
Copyright © 2011-2022 走看看