GreenDao的基本使用以及遇到的坑
- 前言
相比较我上一篇博客Ormlite数据库来说,个人认为GreenDao的易用性强大得多。为什么?接着看。 - 配置
在相应的位置添加上以下下内容,相信大家都懂。
(1)
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.0.1'
compile 'org.greenrobot:greendao-generator:3.0.0'
}
greendao { //和buildTypes同位置
schemaVersion 1
daoPackage 'com.xxx.model.greendao.gen'
targetGenDir 'src/main/java'
}
(2)
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
allprojects {
repositories {
jcenter()
}
}
3.建包
在2中配置了com.xxx.model.greendao.gen,
在com.xxx.model.greendao下建包entity用于存放bean
- class上注释@Entity
- 表id上注释@Id
- 无需记入的数据上注释@Transient
- 然后就可以build-Make Project
@Entity
public class ErrorInfo {
private String ErrorInfoID;
@Id
private String AddTime;
private String ErrorSource;
private String ErrorDetalisInfo;
@Transient
public List<XX> xxList;
}
4.系统生成
Make Project之后系统自动生成了DaoMaster,DaoSession,GreenDaoManager和对应的dao
5. 相关使用代码
DaoSession session = GreenDaoManager.getInstance().getSession();
addProjectDao = session.getS_AddProjectDao();
addProjects = addProjectDao.loadAll();
QueryBuilder<S_Personal> qb = session.getS_PersonalDao().queryBuilder();
List<S_Personal> list = qb
.where(qb.and(S_PersonalDao.Properties.PersonName.eq(editTextuser.getText().toString())
,S_PersonalDao.Properties.PersonPassword.eq(editTextpwd.getText().toString())))
.build().list();
List<S_LoginInfo> s_loginInfos = s_loginInfoDao.queryBuilder().where(S_LoginInfoDao.Properties.PersonID.eq(list.get(0).getPersonID())).build().list();
if (s_loginInfos.size() == 0) {
final S_LoginInfo s_LoginInfo = new S_LoginInfo();
s_LoginInfo.setPersonID(list.get(0).getPersonID());
s_LoginInfo.setLoginTime(CurrentTimes.getCurrentTime());
s_LoginInfo.setWhether("未上传");
s_loginInfoDao.insertOrReplace(s_LoginInfo);
}
开启事务
session.runInTx(new Runnable(){
S_SubwayLineDao dao = session.getS_SubwayLineDao();
List<S_SubwayLine> lineList = dao.queryBuilder().build().list();
for (S_SubwayLine s_subwayLine : lineList) {
dao.deleteInTx(s_subwayLine);
}
session.clear();
for (SubwayLine subwayLine : list) {
for (Interval interval : subwayLine.getIntervals()) {
S_SubwayLine s_SubwayLine = new S_SubwayLine();
s_SubwayLine.setIntervalId(interval.getIntervalId());
s_SubwayLine.setName(subwayLine.getName());
s_SubwayLine
.setIntervalName(interval.getIntervalName());
dao.insertOrReplaceInTx(s_SubwayLine);
}
}
});
6.使用中出现的坑
1. 查询加遍历,出现第二条查询不到的问题,处理方法如下,循环中queryBuilder();
S_ProjectDao s_projectDao = session.getS_ProjectDao();
for(){
QueryBuilder queryBuilder = s_projectDao.queryBuilder();
}
2. 子线程中数据库开启事务,导致概率性不更新UI的问题。建议能不开启事务,就别开启,或者更新UI重新设计
3.
7.介绍就到这里了,相关代码有空上传。