GreenDao的简单使用

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 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的简单使用)