Android SQLite框架greenDAO的使用

转发于http://blog.csdn.net/ada_dengpan/article/details/50676437

Android中集成了SQLite数据库,Android本身提供了完备的SDK提供访问存取SQLite的接口,通过SQLiteOpenHelper类来管理SQLite数据库。在SQLiteOpenHelper类中的onCreate方法中创建数据库,在onUpgrade方法中升级数据库。 
但随着应用的复杂度越来越高,表设计中的字段越来越多,我们编写的SQL语句越来越长,CURD代码越来越冗余冗长,越来越难以维护,而且导致错误率上升,影响开发质量和效率。于是各种ORM的数据库框架应运而生。比如ORMLiteSugarORMGreenDAOActive AndroidRealm等。其中很多基于注解的ORM实现,类似于Hibernate,但在Android设备上,从性能上分析并不可取。greenDAO未采用注解,而是使用代码生成器生成Entity来实现Java对象到数据库实例的映射,效率非常高。 
greenDAO的github地址是https://github.com/greenrobot/greenDAO,官网http://greenrobot.org/greendao

Android Studio中的集成过程:

1、在module的build.gradle中dependencies的添加

compile ‘de.greenrobot:greendao:2.0.0’

2、导入greenDAO的代码生成器模块:

我采用的方式是直接从github上clone整个greenDAO的项目,然后在自己的项目中导入需要的代码生成器模块,导入成功后如图: 
Android_Studio_GreenDAO

3、使用生成器生成Entity,DAO,Master以及Session等greenDAO要用到的类

DaoGeneratorDAOExampleGenerator模块都是Java工程,可以直接右键运行,而且DAOExampleGenerator是依赖于DAOGenerator的。我们在DAOExampleGenerator模块中的方法中进行Java对象的生成:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">public static void main(String[] args) throws Exception {
        Schema schema = new Schema(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"com.idengpan.androidwidgte.db"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

        addNote(schema)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        addCustomerOrder(schema)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

        new DaoGenerator()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.generateAll</span>(schema, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"E:\\2016\\GithubDemo\\AndroidWidget\\app\\src\\main\\java"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    }

    private static void addNote(Schema schema) {
        Entity note = schema<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addEntity</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Note"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addIdProperty</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addStringProperty</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"text"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.notNull</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addStringProperty</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"comment"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addDateProperty</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"date"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    }

    private static void addCustomerOrder(Schema schema) {
        Entity customer = schema<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addEntity</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Customer"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        customer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addIdProperty</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        customer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addStringProperty</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.notNull</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

        Entity order = schema<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addEntity</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Order"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        order<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setTableName</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ORDERS"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // "ORDER" is a reserved keyword</span>
        order<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addIdProperty</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        Property orderDate = order<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addDateProperty</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"date"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getProperty</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        Property customerId = order<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addLongProperty</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"customerId"</span>)<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.notNull</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getProperty</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        order<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addToOne</span>(customer, customerId)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

        ToMany customerToOrders = customer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.addToMany</span>(order, customerId)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        customerToOrders<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setName</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"orders"</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        customerToOrders<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.orderAsc</span>(orderDate)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul>

其中,com.idengpan.androidwidgte.db指这些类生成的包路径,E:\2016\GithubDemo\AndroidWidget\app\src\main\java指的是生成的类对应的Java文件的物理磁盘路径。实际操作过程中,发现它会自动生成包路径的目录,将类生成到E:\2016\GithubDemo\AndroidWidget\app\src\main\java\com\idengpan\androidwidgte\db目录中。生成完,基本上就可以操作了。

注意:这期间,我遇到一个问题,是template not found for name dao.ftl的异常,说是没找到dao.ftl的模板文件,其实这个是存在的。后来经过断点调试,才发现因为经过了locale后,在中文环境下它会寻找dao_zh_CN.ftl的文件,自然就有问题了。于是我将dao.ftl复制了一份,改名为dao_zh_CN.ftl,即解决了这个问题,正常生成了文件。

使用greenDAO

greenDAO操作的都是Java的实体对象,几乎无需单独写完整的SQL代码。我在自定义的Appilication中定义方法中定义获取DAOMaster和DAOSession,这样防止每次操作都要新建DAOMaster和DAOSession的实例。后面我觉得把Application当做单例类用,不太好,就新建了一个DBService,来获取DAOMaster和DAOSession。

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MyApplication</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Application</span> {</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> DaoMaster mDaoMaster;

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> DaoSession mDaoSession;

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> Context mApplicationContext;
    <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onCreate</span>() {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.onCreate();
        mApplicationContext = getApplicationContext();

    }

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> DaoMaster <span class="hljs-title" style="box-sizing: border-box;">getDaoMaster</span>(){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(mDaoMaster == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>){
           DaoMaster.OpenHelper openHelper = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DaoMaster.DevOpenHelper(mApplicationContext,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"test-db"</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>);
           mDaoMaster = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DaoMaster(openHelper.getWritableDatabase());
        }
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> mDaoMaster;
    }

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> DaoSession <span class="hljs-title" style="box-sizing: border-box;">getDaoSession</span>(){
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(mDaoSession == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>){
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span>(mDaoMaster == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>){
                getDaoMaster();
            }
            mDaoSession = mDaoMaster.newSession();
        }
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> mDaoSession;
    }

}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul>
插入

然后插入实例:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">                Note note = new Note()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setText</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"这是Note"</span> + index++)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setDate</span>(new Date())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setComment</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"这是备注"</span> + index)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                MyApplication<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getDaoSession</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.insert</span>(note)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

通过看源码,发现greenDAO是开了事务的,也就是说如果批量插入1000条数据的话,就会使用1000个事务。这是很不科学的。greenDAO给出的方案是:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> MyApplication.getDaoSession().runInTx(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Runnable() {
                    @Override
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">run</span>() {
                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> current = System.currentTimeMillis();
                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> k = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; k < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>; k++) {
                            Note note = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Note();
                            note.setText(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"这是Note"</span> + k);
                            note.setDate(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Date());
                            note.setComment(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"这是备注"</span> + k);
                            MyApplication.getDaoSession().insert(note);
                        }
                        System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"耗时:"</span> + (System.currentTimeMillis() - current));
                    }
                });</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

从测试结果是耗时62ms。效率还是很不错的!!测试几次,有时可以达到48ms,哈哈。如果不采用在事务中批量插入,而是每次插入都开启事务,那么1000条记录的插入耗时2710ms,平均都在2500ms以上,界面会出现卡顿,效率不高,不可取。

注意:这里的Runnable是运行在UI线程的,如果测试时发现事务耗时较长,需要使用Loader。

查询
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">List joes = userDao<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.queryBuilder</span>()
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.where</span>(Properties<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.FirstName</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.eq</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Joe"</span>))
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.orderAsc</span>(Properties<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.LastName</span>)
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.list</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>

QueryBuilder qb = userDao<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.queryBuilder</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
qb<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.where</span>(Properties<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.FirstName</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.eq</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Joe"</span>),
qb<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.or</span>(Properties<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.YearOfBirth</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.gt</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1970</span>),
qb<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.and</span>(Properties<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.YearOfBirth</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.eq</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1970</span>), Properties<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MonthOfBirth</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.ge</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>))))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
List youngJoes = qb<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.list</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

更多的内容可以参考greenDAO的源码以及官网介绍。注意上述代码的符号,qb.or和qb.and是qb.where方法中的参数。 
开发测试时可以打开下面的开关来进行调试:

<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">QueryBuilder.LOG_SQL = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>;
QueryBuilder.LOG_VALUES = <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>;
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
删除

官网是这样描述的:

Bulk deletes do not delete individual entities, but all entities matching some criteria. To perform bulk deletes, create a QueryBuilder, call its buildDelete method, and execute the returned DeleteQuery. This part of the API may change in the future, e.g. convenience methods may be added etc. Keep in mind, that bulk deletes currently do not affect entities in the identity scope, e.g. you could “resurrect” deleted entities if they have been cached before and are accessed by their ID (load method). Consider clearing the identity scope for now, if that may cause issues for your use case.

调用删除也是使用QueryBuilder,也可以加查询条件,然后调用QueryBuilder的buildDelete方法,然后执行返回的DeleteQuery对象的方法,我看了下目前是executeDeleteWithoutDetachingEntities()方法。 
里面也提到,这个删除的API未来可能会变更,比如会增加一些更方便使用的API。 
于是批量删除的示例代码如下:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">QueryBuilder qbDel = DBService<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getDaoSession</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.queryBuilder</span>(Note<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.class</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                qbDel<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.where</span>(NoteDao<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Properties</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Id</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.gt</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1000</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                DeleteQuery dq = qbDel<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.buildDelete</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                dq<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.executeDeleteWithoutDetachingEntities</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

如果是单个Entity的删除,就简单了,可以使用DAO或Session中的方法来执行delete方法,传入要删除的Entity即可。 
而且它还是按id为key进行删除的,其它的字段不校验。于是使用下面的代码就可以删除id为10的Note对象。

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> Note note = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Note(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10l</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"测试delete文本 10"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"测试delete备注 10"</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Date());
 DBService.getDaoSession().<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">delete</span>(note);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
更新

很简单:

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Note note = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Note(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>l,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"测试update文本 10"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"测试update备注 10"</span>,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Date</span>());
DBService.getDaoSession().update(note);</code>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值