配置gradle
1 | // 工程gradle文件 |
编写实体类
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 | @Entity |
MakeProject
编译项目,User类和LogBean会自动生成一些方法,同时在指定目录下会生成dao相关的类
初始化数据库
1 | private void initDbHelp() { |
两个坑
- 当我以一个用户的id向副表中插入了一条数据之后,再调用该用户实体的getList()方法,返回的集合size一直不变,这是因为greendao将集合缓存了,只有在调用getList()方法前先调用reset()方法,才会重新去查询副表里的数据。要注意在调用reset()方法后,用户实体的集合字段是重新创建的,如果有将这个集合传到Adapter里,再调用Adapter的notifyDataSetChanged()方法是不会去刷新数据的。
- 模糊查询时,需要在字符串前后加上”%”,否则匹配不到,如下:
1
2
3mUsers = UfcApp.sUserDao.queryBuilder()
.where(UserDao.Properties.Name.like("%" + name + "%"))
.list();