美文网首页
GreenDao3.x 的Rx的使用

GreenDao3.x 的Rx的使用

作者: johnnycmj | 来源:发表于2017-07-31 15:40 被阅读922次

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


    官网地址:http://greenrobot.org/greendao/
    Github地址:https://github.com/greenrobot/greenDAO

    1 greendao-gradle-plugin 配置

    在根build.gradle 中的buildscript 的dependencies 配置 :classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

    buildscript {
        repositories {
            jcenter()
            mavenCentral()
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.2'
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
        }
    }
    

    2 加apply plugin

    在组件build.gradle 头部中加入apply plugin: 'org.greenrobot.greendao'

    apply plugin: 'org.greenrobot.greendao'
    
    

    3 数据库版本

    greendao {
        schemaVersion 1
    }
    

    4 依赖配置

    
        compile 'org.greenrobot:greendao:3.2.2'
        // This is only needed if you want to use encrypted databases
        compile 'net.zetetic:android-database-sqlcipher:3.5.6'
    
        compile 'com.jakewharton.rxbinding:rxbinding:1.0.1'
        compile 'io.reactivex:rxandroid:1.2.1'
        compile 'io.reactivex:rxjava:1.2.9'
    

    5 新建实体

    /**
     * <pre>
     *     author: chmj
     *     time  : 2017/7/28
     *     desc  :
     * </pre>
     */
    
    /**
     * schema:告知GreenDao当前实体属于哪个schema
     * active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
     * nameInDb:在数据中使用的别名,默认使用的是实体的类名
     * indexes:定义索引,可以跨越多个列
     * createInDb:标记创建数据库表
     */
    @Entity
    public class Student {
    
        /**
         * @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
         * @Property 设置一个非默认关系映射所对应的列名,默认是的使用字段名 举例:@Property (nameInDb="name")
         * @NotNul 设置数据库表当前列不能为空
         * @Transient 添加次标记之后不会生成数据库表的列
         * @Index 使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
         * @Unique 向数据库列添加了一个唯一的约束
         * @ToOne 定义与另一个实体(一个实体对象)的关系
         * @ToMany 定义与多个实体对象的关系
         */
        @Id(autoincrement = true)
        private Long id;
    
        private String studentName;
    
        private int age;
    
        private Date birthday;
    
    
        @Generated(hash = 65138557)
        public Student(Long id, String studentName, int age, Date birthday) {
            this.id = id;
            this.studentName = studentName;
            this.age = age;
            this.birthday = birthday;
        }
    
        @Generated(hash = 1556870573)
        public Student() {
        }
    
    
        public String getStudentName() {
            return studentName;
        }
    
        public void setStudentName(String studentName) {
            this.studentName = studentName;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", studentName='" + studentName + '\'' +
                    ", age=" + age +
                    ", birthday=" + TimeUtils.date2String(birthday) +
                    '}';
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    }
    

    1.)实体@Entity注解

    • schema:告知GreenDao当前实体属于哪个schema
    • active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
    • nameInDb:在数据中使用的别名,默认使用的是实体的类名
    • indexes:定义索引,可以跨越多个列
    • createInDb:标记创建数据库表**

    2.)基础属性注解

    • @Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
    • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名举例:@Property (nameInDb="name")
    • @NotNul:设置数据库表当前列不能为空
    • @Transient:添加次标记之后不会生成数据库表的列

    3.)索引注解

    • @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
    • @Unique:向数据库列添加了一个唯一的约束

    4.)关系注解

    • @ToOne:定义与另一个实体(一个实体对象)的关系
    • @ToMany:定义与多个实体对象的关系

    6 编译

    点击编译,则会自动创建代码,目录在:build ->generated -> source -> greendao

    会自动创建: DaoMaster,DaoSession, Dao;

    7 DbHelper

    
    /**
     * <pre>
     *     author: chmj
     *     time  : 2017/7/27
     *     desc  :
     * </pre>
     */
    
    public class DbHelper {
    
        /** 数据库是否加密的标识 */
        public static final boolean ENCRYPTED = true;
    
        private DaoSession mDaoSession;
    
        private DbHelper() {
            createDao();
        }
    
        private static class SingletonHolder {
            private static final DbHelper INSTANCE = new DbHelper();
        }
    
        //获取单例
        public static DbHelper getInstance() {
            return DbHelper.SingletonHolder.INSTANCE;
        }
    
    
        public DaoSession getDaoSession() {
            return mDaoSession;
        }
    
        private void createDao(){
            //创建数据库
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(Utils.getContext(), ENCRYPTED ? "notes-db-encrypted" : "notes-db");
            //获取数据库读写的权限,如果进行加密调用helper.getEncryptedWritableDb("super-secret"),参数为设置的密码
            Database db = ENCRYPTED ? helper.getEncryptedWritableDb("super-secret") : helper.getWritableDb();
            mDaoSession = new DaoMaster(db).newSession();
        }
    }
    

    如果数据是加密的,则要用解密去获取实例。

    8 初始化

    在Application 或者需用到的Activity的onCreate()中初始化。

            
            DaoSession daoSession = DbHelper.getInstance().getDaoSession();
            noteDao = daoSession.getStudentDao().rx();
            noteRxQuery = daoSession.getStudentDao().queryBuilder().orderAsc(StudentDao.Properties.StudentName).rx();
    

    查询noteRxQuery.list()

    noteRxQuery.list()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Action1<List<Student>>() {
                        @Override
                        public void call(List<Student> students) {
                            mAdapter.setData(students);
                            mSwipeLayout.setRefreshing(false);
                        }
                    });
    

    RxQuery:

    • rx.Observable<java.util.List<T>> list():获取实体集合,返回含有该实体集合的Observable
    • rx.Observable<T> unique():返回含有该实体的Observable
    • rx.Observable<T> oneByOne():产生一个一个的实体

    RxDao

    • rx.Observable<java.lang.Long> count(): 返回一个含有数据库数据个数的Observable。

    删除:

    • rx.Observable<java.lang.Void> delete(T entity):从数据库中删除数据,并返回一个空的Observable
    • rx.Observable<java.lang.Void> deleteAll(): 删除所有数据,并返回一个空的Observable
    • rx.Observable<java.lang.Void> deleteByKey(K key):将数据库中主键为key的数据删除,,并返回一个空的Observable
    • rx.Observable<java.lang.Void> deleteByKeyInTx(java.lang.Iterable<K> keys):使用事务操作,将数据库中,删除key集合中每个key所对应的实体,并返回一个空的Observable
    • rx.Observable<java.lang.Void> deleteByKeyInTx(K... keys): 使用事务操作,将数据库中,删除key[]中每个key所对应的实体,并返回一个空的Observable
    • rx.Observable<java.lang.Void> deleteInTx(java.lang.Iterable<T> entities):使用事务操作,将数据库中,删除实体集合中每个实体所对应的实体,并返回一个空的Observable
    • rx.Observable<java.lang.Void> deleteInTx(T... entities):使用事务操作,将数据库中,删除实体集合中每个实体[ ]所对应的实体,并返回一个空的Observable

    插入:

    • rx.Observable<T> insert(T entity) : 插入一个实体.
    • rx.Observable<java.lang.Iterable<T>> insertInTx(java.lang.Iterable<T> entities): 插入一个list数组。
    • rx.Observable<java.lang.Object[]> insertInTx(T... entities) 插入实体数组
    • rx.Observable<T> insertOrReplace(T entity):插入数据,如果已存在则更新。
    • rx.Observable<java.lang.Iterable<T>> insertOrReplaceInTx(java.lang.Iterable<T> entities):插入替换list数组
    • rx.Observable<java.lang.Object[]> insertOrReplaceInTx(T... entities):插入替换数组

    查询,&更新:

    • rx.Observable<T> load(K key):获取主键为key的实体。
    • rx.Observable<java.util.List<T>> loadAll():获取全部数据。
    • rx.Observable<T> refresh(T entity):更新实体。

    保存:

    • rx.Observable<T> save(T entity):插入数据,如果已存在则更新。
    • rx.Observable<java.lang.Iterable<T>> saveInTx(java.lang.Iterable<T> entities):插入替换list数组
    • rx.Observable<java.lang.Object[]> saveInTx(T... entities):插入替换数组

    更新:

    • rx.Observable<T> update(T entity): 跟新
    • rx.Observable<java.lang.Iterable<T>> updateInTx(java.lang.Iterable<T> entities):批量更新list
    • rx.Observable<java.lang.Object[]> updateInTx(T... entities):批量跟新数组。
    noteDao.insert(student)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Action1<Student>() {
                        @Override
                        public void call(Student student) {
                            mAddDailog.cancel();
                            onRefresh();
                        }
                    });
    
    noteDao.update(mUpdateStu)
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new Action1<Student>() {
                                @Override
                                public void call(Student student) {
                                    mEditDialog.cancel();
                                    onRefresh();
                                }
                            });
    
    noteDao.delete(mDelStu)
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new Action1<Void>() {
                                @Override
                                public void call(Void aVoid) {
                                    mDelDialog.cancel();
                                    onRefresh();
                                }
                            });
    

    相关文章

      网友评论

          本文标题:GreenDao3.x 的Rx的使用

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