GreenDao使用记录

作者: 三十二蝉 | 来源:发表于2017-04-24 11:21 被阅读840次

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

    相关文章

      网友评论

        本文标题:GreenDao使用记录

        本文链接:https://www.haomeiwen.com/subject/jgwuzttx.html