GreenDao使用记录

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,497评论 25 709
  • Android基础及相关机制 Android Context 上下文 你必须知道的一切 Android中子线程真的...
    楷桐阅读 2,033评论 1 30
  • 和同事一起吃饭,总能听到他说,这个菜不好吃,这个菜辣了,这个菜好少,这个菜好淡等等。很厌烦,是真的! 心里想,如果...
    逐浪的海阅读 452评论 0 1
  • 上帝为每个人都关上了一扇门,而那些努力的人已经连窗户都踹开了。 放眼望去,似乎身边的每一个人都在自己生活的轨道上忙...
    一只大瑞阅读 859评论 2 0
  • 王昱珩说:“还记得第一次看水,那一刻我的世界太过安静,静得可以听见自己心跳的声音。” 看过“最强大脑”这个节目的人...
    Anitaanina阅读 3,966评论 32 162