美文网首页
GreenDao的简单使用

GreenDao的简单使用

作者: Wang_Mr | 来源:发表于2018-04-16 18:03 被阅读0次

    1.配置 root的build.gradle

    buildscript {
        repositories {
            jcenter()
            ...
            mavenCentral() // 添加仓库
        }
        dependencies {
            ...
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // 添加插件
        }
    }
    

    2.配置module的build.gradle

    apply plugin: 'org.greenrobot.greendao' // 在最上方添加插件
    
    dependencies {
        ...
        implementation 'org.greenrobot:greendao:3.2.2' // 添加库
    }
    

    3.继续配置module的build.gradle(添加schema版本)

    android {
    ...
    }
     
    greendao {
        schemaVersion 2
        daoPackage 'xxx.xxx.xx.greendao'
        targetGenDir 'src/main/java'
    }
    
    dependencies {
    ...
    }
    
    • schemaVersion 数据库schema版本(必填,数据库版本升级时需要增加版本号)
    • daoPackage 设置(自动生成类)DAOs, DaoMaster, and DaoSession的包名
    • targetGenDir 设置(自动生成类)DAOs, DaoMaster, and DaoSession的目录

    4.创建实体类

    @Entity
    public class User {
        @Id(autoincrement = true)
        private Long id;
     
        private String name;
    
    }
    
    • 通过@ Entity设置实体类
    • @Id 主键(必须是Long型)可以通过(autoincrement = true)设置为主键自增长
    • @NotNull 设置当前列不能为空

    5.Application中进行初始化

    // 在onCreate()进行初始化
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes.db", null);
    Database db = helper.getWritableDb();
    DaoMaster daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
    
    
    // 提供获得DaoSession对象的方法
    public DaoSession getDaoSession() {
        return daoSession;
    }
    

    6.在activities/fragments获得DAO进行操作数据库

    getDaoSession().getNoteDao();
    

    7.删除数据库所有数据

    // 项目中如果登录用户进行变更数据不能共用,则需要删除表并创建表
    // getDb()为Application中提供获得Database的方法
    DaoMaster.dropAllTables(getDb(),true);
    DaoMaster.createAllTables(getDb(),true);
    

    8.表关联
    比如:一个组长有多个组员(一对多关系)

    /**组长表*/
    @Entity
    public class Leader {
    
        @Id(autoincrement = true)
        private Long id;
        private LeaderName;
    
        @ToMany(referencedJoinProperty = "memberId")
        private List<Member> list;
    }
    
    /**组员表*/
    @Entity
    public class Member {
    
        @Id(autoincrement = true)
        private Long id;
    
        // 此处自定义memberId,用于和组长对应
        private Long memberId;
        private String memberName;
    }
    

    json数据

    {
      "leaderName": "刘xx",
      "members": [
        {
          "jyzyxm": "焦xx"
        },
        {
          "jyzyxm": "王xx"
        }
      ]
    }
    

    存数据

    leader = new Leader("刘xx");
    leaderDao.insert(leader);
    for (int k = 0; k < members.size(); k++) {
        membersDao.insert(new Member(memberName, leader.getId()));
    }
    

    9.使用外部数据库
    所谓外部数据库文件此处指的就是一个在外部单独创建的db文件,假设有这么一个场景,项目中有一些本地数据,不需要接口去获取的(不需要进行网络操作),比如全国各个省各个市的一些基本信息,每个市的信息可以作为表里的一条记录存放,在项目中进行使用

    • ①需要把外部的数据转移到databases
      copy过去的数据库可能会多出几张表,因为操作本身数据库时用@Entity创建表了(所以转移到databases时,就自动创建表了)
        /**
         * assets目录下的db转移到databases
         *
         * @param context     上下文对象
         * @param assetsName  assets目录下db的文件名
         * @param isNeedCover 是否需要覆盖
         */
        public static void copyDBToDatabases(Context context, String assetsName, Boolean isNeedCover) {
    
            // 获取内部存储目录
            String path = context.getFilesDir().getParent();
    
            try {
    
                // 组装生成db的目录(不存在则创建目录)
                String dbFolder = path + File.separator + "databases" + File.separator;
                File file = new File(dbFolder);
                if (!file.exists()) {
                    file.mkdirs();
                }
    
    
                // 组装db路径
                String outFileName = dbFolder + assetsName;
    
                File dataFile = new File(outFileName);
    
                // 文件不存在创建 或 文件存在且覆盖也创建
                if (!dataFile.exists() || (dataFile.exists() && isNeedCover)) {
    
                    if (dataFile.exists()) {
                        dataFile.delete();
                    }
    
    
                    InputStream myInput = context.getAssets().open(assetsName);
                    OutputStream myOutput = new FileOutputStream(outFileName);
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = myInput.read(buffer)) != -1) {
                        myOutput.write(buffer, 0, length);
                    }
                    myOutput.flush();
                    myOutput.close();
                    myInput.close();
                }
    
    
            } catch (IOException e) {
                Log.i("DbUtils", "error--->" + e.toString());
                e.printStackTrace();
            }
    
        }
    
    • ②需要新提供一个操作复制外部数据库的DaoSession
    DaoSession daoSession = new DaoMaster(
                    new DaoMaster.DevOpenHelper(this, "转移到databases下的db文件", null)
                            .getWritableDb()).newSession();
    
    • ③依然需要创建实体类

    @nameInDb 在数据库中的名字
    用@nameInDb 限制下实体类的字段与数据库的字段一一对应
    createInDb 是否创建表,默认true
    因为操作的是外部数据库,是copy而来的,不需要创建表,设为false。如果实体类和copy的数据库中的表名一致可能会报表已存在异常

    @Entity(nameInDb = "user", createInDb = false)
    public class User {
    
        @Property(nameInDb = "id")
        private Long id;
        @Property(nameInDb = "name")
        private String name;
    
        ...
    }
    
    • ④可以愉快的操作外部数据库了

    相关文章

      网友评论

          本文标题:GreenDao的简单使用

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