参考:
GreenDao3.0学习(一)
GreenDao3.0学习(二)
GreenDao3.0学习(三)
github : https://github.com/greenrobot/greenDAO
GreenDao是一个用于Android开发的对象/关系映射(ORM)工具。它向SQLite数据库提供了一个对象导向的接口。主要是将对象映射到SQLite数据库中,GreenDao3.0是greendao的一个新的版本。
真机中没看到数据库文件,查了网上资料,可能是手机没有root就看不到我们创建的数据库。
也可以把这个配置代码放在module的build.gradle
中
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
GreenDao | 含义 |
---|---|
schemaVersion | 数据库版本号 |
daoPackage | dao所在的包名 |
targetGenDir | 自动生成的数据库文件的目录 |
如果上面不指定目录的话,数据库文件就会生成到build/generated/source/greendao
下面,还需要拷贝到自己的目录中,所以这里还是指定生成目录为好。
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
greendao{
schemaVersion=1
daoPackage 'com.cqc.greendao05.dao.gen'
targetGenDir 'src/main/java'
}
点击小锤子(make project)会生成3个数据库管理类:DaoMaster``DaoSession``PersonInfoDao
,以及PersonInfo
的gets and sets
public class GreenDaoManager {
private DaoMaster.DevOpenHelper helper;
private DaoMaster daoMaster;
private DaoSession daoSession;
private static GreenDaoManager greenDaoManager;
private GreenDaoManager() {
helper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "GreenDao_DB");
daoMaster = new DaoMaster(helper.getWritableDb());
daoSession = daoMaster.newSession();
}
public static GreenDaoManager getInstance() {
if (greenDaoManager == null) {
greenDaoManager = new GreenDaoManager();
}
return greenDaoManager;
}
public DaoMaster.DevOpenHelper getDevOpenHelper() {
return helper;
}
public DaoMaster getDaoMaster() {
return daoMaster;
}
public DaoSession getDaoSession() {
return daoSession;
}
public void closeDB() {
if (helper != null) {
helper.close();
}
}
}
并在Application
中初始化,别忘了在AndroidManifest.xml
中配置name
。
public class MyApplication extends Application {
private static Context context ;
@Override
public void onCreate() {
super.onCreate();
context = this;
GreenDaoManager.getInstance();
}
public static Context getContext() {
return context;
}
}
dao是增删改查的操作类
PersonInfoDao dao = GreenDaoManager.getDaoSession().getPersonInfoDao();
由于查询用的最多,这里想介绍查询,GreenDao采用了构造这模式
查询结果为集合 :
List usersList = dao.queryBuilder().build().list();
查询结果为实体类:where
表示条件
PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();
PersonInfo info = new PersonInfo(id, name, age);
dao.insert(info);
删除一个对象:
PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();
dao.delete(info);
删除多个对象
List userList = dao.queryBuilder().where(PersonInfoDao.Properties.Name.eq(name)).build().list();
for (PersonInfo info : userList) {
dao.delete(info);
}
删除全部数据
dao.deleteAll()
先根据条件查询到数据,再进行修改
String id = et1.getText().toString().trim();
PersonInfo info = dao.queryBuilder().where(PersonInfoDao.Properties.Id.eq(id)).build().unique();
info.setName(info.getName() + "update");
dao.update(info);
注解名称 | 说明 |
---|---|
schema | 使得GreenDao知道当前实体属于哪个schema |
active | 标记一个实体处于活动状态,活动实体有更新、删除和刷新方法 |
nameInDb | 在数据中使用的别名,默认使用的是实体的类名 |
indexes | 定义索引,可以跨越多个列 |
createInDb | 标记创建数据库表 |
@Entity | greendao的一个实体注解,因为有了它,我们的实体类才回被greendao识别并生成一个dao |
@Id | 主键 Long型(默认是自增长的)也可以通过@Id(autoincrement = true)设置自增长 |
@NotNull | @NotNull 标记后,表示这个属性在数据表中的这一列不能为空 |
@Transient | 添加这个标记之后,我们在实体类中的属性不会自动在数据表中生成这个属性表示的这一列 |
@Unique | 向数据库列添加了一个唯一的约束 |
schema | 使得GreenDao知道当前实体属于哪个schema |
active | 标记一个实体处于活动状态,活动实体有更新、删除和刷新方法 |
nameInDb | 在数据中使用的别名,默认使用的是实体的类名 |
indexes | 定义索引,可以跨越多个列 |
createInDb | 标记创建数据库表 |
@Property | 设置一个非默认关系映射所对应的列名,默认是的使用字段名 比如:@Property (nameInDb=”name”) |
@Index | 使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束 |
@ToOne | 定义与另一个实体(一个实体对象)的关系,即一对一 |
@ToMany | 定义与多个实体对象的关系 即一对多 |
@JoinEntity | 多对多 |
referencedJoinProperty | 指定目标实体中与源实体相对应的外键 |
joinProperty | 对于复杂一点的关系可以定义一组@JoinProperty注解。每个@JoinProperty注解都需要有源实体中的源属性和对应实体中的引用属性。 |
源码:https://git.oschina.net/libraryDemo/GreenDao05
开始没有sex属性,运行正确,再添加sex属性,点击,结果报错。
报错截图:
报错的信息是:没有sex这一列,但是我已经添加了,无论是PersonInfo
,还是PersonInfoDao
,都有sex.
那么问题出在哪里呢。
解决方法:
卸载原app,在运行代码即可解决。所以我觉得是AS的问题。