greendao3.0一对多的应用

配置gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 工程gradle文件
buildscript {
repositories {
jcenter()
mavenCentral() // add repository
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
}
}

// 项目gradle文件
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin

dependencies {
compile 'org.greenrobot:greendao:3.2.2' // add library
}

android {
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.sunflower.FindCam.dao' //自动生成的工具类的包名
targetGenDir 'src/main/java' //路径
}
}

编写实体类

greendao 一对多的应用。比如一个用户,可以有多条检查记录,不同的检查记录可同时属于一个用户,这里就可以建立两张表,这里称主表和副表,主表中可定义如下一个字段:

1
2
@ToMany(referencedJoinProperty = "userId")
private List<LogBean> mLogBeanList;

用来定义单个用户的所有检查记录,同时在副表的实体中定义一个以”userId”命名的字段,当往副表中插入数据的时候,将副表实体的”userId”的值设置为主表中的id,即可完成关联,这样只要在调用主表的实体中调用getMLogBeanList()就会自动去副表中查询相关联的数据。
实体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity
public class User {
//id自动增长
@Id(autoincrement = true)
private Long id;

private int age; //年龄
private int count; //检查次数
private String name; //名字
private String number; //电话
private String address1; //地址1
private String address2; //地址2
private String date; //最近检查日期

//一对多
@ToMany(referencedJoinProperty = "userId")
private List<LogBean> mLogBeanList;
}

1
2
3
4
5
6
7
8
9
10
11
@Entity
public class LogBean {
@Id(autoincrement = true)
private Long id;
private Long userId;

private String date;

private boolean isPIC;
private String path;
}

MakeProject

编译项目,User类和LogBean会自动生成一些方法,同时在指定目录下会生成dao相关的类

初始化数据库

1
2
3
4
5
6
7
8
private void initDbHelp() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "users.db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
sUserDao = daoSession.getUserDao();
sLogDao = daoSession.getLogBeanDao();
}

两个坑

  • 当我以一个用户的id向副表中插入了一条数据之后,再调用该用户实体的getList()方法,返回的集合size一直不变,这是因为greendao将集合缓存了,只有在调用getList()方法前先调用reset()方法,才会重新去查询副表里的数据。要注意在调用reset()方法后,用户实体的集合字段是重新创建的,如果有将这个集合传到Adapter里,再调用Adapter的notifyDataSetChanged()方法是不会去刷新数据的。
  • 模糊查询时,需要在字符串前后加上”%”,否则匹配不到,如下:
    1
    2
    3
    mUsers = UfcApp.sUserDao.queryBuilder()
    .where(UserDao.Properties.Name.like("%" + name + "%"))
    .list();