GreenDao使用记录

GreenDao介绍

greenDAO是一个帮助Android开发者将数据存到SQLite中的一个开源项目。SQLite是一个很好的嵌入式关系数据库。然而,开发它需要大量额外的工作。编写SQL和解析查询结果是相当繁琐的任务。greenDAO将会为你做这些工作:它把Java对象映射到数据表(通常被叫做ORM:[https://en.wikipedia.org/wiki/Object-relational_mapping] )。这样,你可以使用一个简单的面向对象的接口来存储、更新、删除和查询Java对象。将时间集中在真正的问题上。

GreenDao使用记录_第1张图片

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 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住,这样也能完成需求。

你可能感兴趣的:(GreenDao使用记录)