GreenDao介绍
greenDAO是一个帮助Android开发者将数据存到SQLite中的一个开源项目。SQLite是一个很好的嵌入式关系数据库。然而,开发它需要大量额外的工作。编写SQL和解析查询结果是相当繁琐的任务。greenDAO将会为你做这些工作:它把Java对象映射到数据表(通常被叫做ORM:[https://en.wikipedia.org/wiki/Object-relational_mapping] )。这样,你可以使用一个简单的面向对象的接口来存储、更新、删除和查询Java对象。将时间集中在真正的问题上。
greenDAO的主要设计目标**
·性能最大化(对于Android来说,可能是最快的ORM)
·很容易使用APIs
·对Android高度优化
·最小的内存开销
·较小的文件体积,将注意力集中在重点上
GreenDao项目引入
** gradle依赖 **
//greendao 3
compile 'org.greenrobot:greendao:3.2.2'
自定义数据库升级逻辑
在gradle中添加greenDao version
greendao {
//数据库版本号
schemaVersion 1
}
greenDao默认的DevOpenHelper升级策略是丢弃所有数据,代码如下:
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name) {
super(context, name);
}
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
自定义升级策略只需要自定义一个继承OpenHelper的类,在onUpgrade方法中定义具体的升级逻辑。
然后在数据库初始化的时候使用自定义的OpenHelper:
public static void init(WordApplication app) throws IOException{
WordDaoMaster.WordOpenHelper helper = new WordDaoMaster.WordOpenHelper(app,"dbname",null);
SQLiteDatabase db = helper.getWritableDatabase();
DBManager.daoMaster = new WordDaoMaster(db);
}
GreenDao使用中碰到的问题
greenDao的使用非常简单,但是使用中页碰到了一些问题:
greenDao中没有insertOrIgnore方法
开发中碰到一个需求,需要批量插入数据,如果数据库中已经存在这条数据,则忽略。
查了greendao的api,带InTx后缀的方法在内部已经完成了事务的相关处理,例如如下代码:
public static void addWordIntoWordMeaning(final List<WordMeaning> wordMeanings){
DaoSession daoSession = daoMaster.newSession();
WordMeaningDao wordMeaningDao = daoSession.getWordMeaningDao();
wordMeaningDao.insertOrReplaceInTx(wordMeanings);
}
使用起来的确非常简单,但是找了半天没有insertOrIgnoreInTx的方法。其实,之前也有人提出了这个问题[https://github.com/greenrobot/greenDAO/pull/145]
但是greenDao的开发组没有接受这个建议,至今API里面没有这个方法。如此一来,想要实现这个方法就必须自己改源码了。修改greenDao这种项目的源码很容易自己改出bug。最后用如下方法解决:
DaoSession daoSession = daoMaster.newSession();
final ExamAnswerDao examAnswerDao = daoSession.getExamAnswerDao();
daoSession.runInTx(new Runnable() {
@Override
public void run() {
for(ExamAnswer examAnswer:list){
try {
examAnswerDao.insert(examAnswer);
}catch (Exception e){
Logcat.e(TAG,"record exist");
}
}
}
});
greenDao提供了一个runInTx的方法,参数是一个Runnable实例,对runnable内的代码使用事务操作。这里比较粗暴的用insert方法插入,对已经存在的数据会报错,直接catch住,这样也能完成需求。
网友评论