GreenDAO快速入门

作者: g小志 | 来源:发表于2017-11-15 21:29 被阅读100次

    前言

    之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的差异。只停留在会使用的阶段。说起来也是惭愧。本文的重点也是在于如何快速使用。不会进行较深的探究。


    GreenDAO:

    介绍:对象关系映射的数据库(ORM)

    GreenDAO
    官网地址
    • 优点
    1. 性能高,号称Android最快的关系型数据库
    2. 内存占用小
    3. 库文件小,编译时间短
    4. 支持数据库加密
    5. API简介易用

    说了他的优点,那么我们来看下如何使用。


    • 导入
      首先在Project下的build.gradle中添加如下:
    // Top-level build file where you can add configuration options common to all sub-projects/modules.
    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.3'
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
        }
    }
    
    ...
    

    在App中的build.gradle添加如下:

    apply plugin: 'com.android.application'
    apply plugin: 'org.greenrobot.greendao'
    
    android {
      ...//省略
    }
    
    dependencies {
    
        ...//省略
        compile 'org.greenrobot:greendao:3.2.0'
    }
    

    • 注解
    实体@Entity注解
    1. schema:告知GreenDao当前实体属于哪个schema
    2. active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
    3. nameInDb:在数据中使用的别名,默认使用的是实体的类名
    4. indexes:定义索引,可以跨越多个列
    5. createInDb:标记创建数据库表
    基础属性注解
    1. @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
    2. @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
    3. @NotNul:设置数据库表当前列不能为空
    4. @Transient :添加次标记之后不会生成数据库表的列
    索引注解
    1. @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
    2. @Unique:向数据库列添加了一个唯一的约束
    关系注解

    @ToOne:定义与另一个实体(一个实体对象)的关系
    @ToMany:定义与多个实体对象的关系
    这里只是取出一些具有代表性的注解,想了解更多请查看上面官方文档地址


    在了解了基本的注解后我们来看下如何具体使用:

    1. 首先创建的我们的实体类
    @Entity
    public class User {
    
        @Id
        private Long id;
        private String name;
        private int age;
        private String sex;
    }
    

    创建完成后需要Rebuild Project,之后User会变成:

    @Entity
    public class User {
    
        @Id
        private Long id;
        private String name;
        private int age;
        private String sex;
    
        public User(String name, int age, String sex) {//自己添加的构造方法,并非GreenDAO生成的
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
    
        @Generated(hash = 689493095)
        public User(Long id, String name, int age, String sex) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.sex = sex;
        }
    
        @Generated(hash = 586692638)
        public User() {
        }
    
        public Long getId() {
            return this.id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return this.age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getSex() {
            return this.sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
    }
    
    

    同时会生成3个类:

    图片.png
    UserDao:我们的增删改查都是通过他来完成的。
    DaoSession:用来注册UserDao,提供创建UserDao的方法
    DaoMaster:主要是用来创建DaoSession和一些更新,创建,删除表的一些炒作
    里面的源码不多,有兴趣的可以看下。
    剩下的我们就来具体看下我们和进行输出操作:
    public class DBManager {
        public static DBManager instance;
    
        private DaoMaster.DevOpenHelper mOpenHelper = null;
        private static final String DB_NAME = "test_db";
        private Context context;
    
        private DBManager(Context context) {
            this.context = context;
        }
    
        public static DBManager getInstance(Context context) {
            if (instance == null) {
                synchronized (DBManager.class) {
                    if (instance == null) {
                        instance = new DBManager(context);
                    }
                }
            }
            return instance;
        }
    
        public SQLiteDatabase getReadableDatabase() {
            if (mOpenHelper == null) {
                mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
            }
            return mOpenHelper.getReadableDatabase();
        }
    
        public SQLiteDatabase getWritableDatabase() {
            if (mOpenHelper == null) {
                mOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME);
            }
            return mOpenHelper.getWritableDatabase();
        }
    
        //保存一个User
        public void saveUser(User user) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            userDao.save(user);//与userDao.insert()大致相同区别在于如果不存在就插入,存在就Update修改
    
        }
    
        //保存User集合
        public void saveUserOrList(List<User> users) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            userDao.saveInTx(users);
        }
    
        //保存多个User
        public void saveUserOrUsers(User... users) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            userDao.saveInTx(users);
        }
    
        public void deleteUser(User user) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            userDao.delete(user);
        }
    
        public void deleteUserById(Long id) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            userDao.deleteByKey(id);
        }
    
        public void updateUser(User user) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            userDao.update(user);
        }
    
        public List<User> queryBySex(String sex) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            QueryBuilder<User> queryBuilder = userDao.queryBuilder();
            List<User> users = queryBuilder.where(UserDao.Properties.Sex.eq(sex)).list();
            return users;
        }
        public List<User> query() {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            List<User> users = userDao.queryBuilder().build().list();
            return users;
        }
        public List<User> queryByAge(int age) {
            DaoMaster daoMaster = new DaoMaster(getWritableDatabase());
            DaoSession session = daoMaster.newSession();
            UserDao userDao = session.getUserDao();
            QueryBuilder<User> queryBuilder = userDao.queryBuilder();
            List<User> users = queryBuilder.offset(1)
                    .limit(3)
                    .orderAsc(UserDao.Properties.Age)
                    .where(UserDao.Properties.Age.eq(age))
                    .build()
                    .list();
            return users;
        }
    
        public void updateDatabase(int version) {
            mOpenHelper.onUpgrade(getWritableDatabase(), 1, version);
        }
    }
    

    需要注意的是在升级数据库的时候回将原来的数据删除,可能会造成丢失推荐学习文章

    GreenDAO的大部分操作都有这里。对于更高级的用法还需要大家自己去学习和探索,毕竟本文的核心和题目一样,快速入门。
    为了方便学习推荐一篇文章greenDAO 3.2 初探或者查阅官网地址

    相关文章

      网友评论

        本文标题:GreenDAO快速入门

        本文链接:https://www.haomeiwen.com/subject/kszhvxtx.html