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;
...
}
- ④可以愉快的操作外部数据库了