GreenDao 3.2.0 的基本使用

作者: 往事都随风吧 | 来源:发表于2017-01-13 20:54 被阅读1911次

    前言

    Android开发中我们或多或少都会接触到数据库。Android中提供了一个占用内存极小的关系型数据库-SQLite。虽然Android系统中提供了许多操作SQLite的API,但是我们还是需要手动去编写SQL语句,这经常会出现一些莫名其妙的问题(😂,不要问我为什么)。所以便出现了许多ORM(对象关系映射)框架。其中比较著名的有GreenDao、OrmLite、Litepal等。下面主要介绍一下GreenDao,我平时用的最多的也是GreenDao。

    GreenDao简介

    offical.png

    官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。(greenDAO is a light & fast ORM solution that maps objects to SQLite databases.)

    GreenDao特点

    • 性能最大化,可能是Android平台上最快的ORM框架
    • 易于使用的API
    • 最小的内存开销
    • 依赖体积小
    • 支持数据库加密
    • 强大的社区支持

    GreenDao有如此多的有点,我们还有什么理由不去使用它呢。

    GreenDao配置

    (1) 在build.gradle(Module:app)中添加下面代码:

    buildscript { 
          repositories {
                 mavenCentral()
          }
          dependencies {
                  classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' 
           }
     }
    
     apply plugin: 'org.greenrobot.greendao'
    
     dependencies {
             compile 'org.greenrobot:greendao:3.2.0'
     }
    

    (2)或者在build.gradle(Project:app)下面添加如下代码:

    buildscript { 
          repositories {
                 mavenCentral()
          }
          dependencies {
                  classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' 
           }
     }
    

    同时在build.gradle(Module:app)中添加下面代码:

     apply plugin: 'org.greenrobot.greendao'
    
     dependencies {
             compile 'org.greenrobot:greendao:3.2.0'
     }
    

    其他配置

    build.gradle(Module:app)中添加:

    greendao {   
            schemaVersion 1//数据库版本号    
            daoPackage 'com.com.sky.downloader.greendao'//设置DaoMaster、DaoSession、Dao包名    
            targetGenDir 'src/main/java'//设置DaoMaster、DaoSession、Dao目录   
            //targetGenDirTest:设置生成单元测试目录    
           //generateTests:设置自动生成单元测试用例
    }
    
    custom.png

    上述配置是可选项,如果不配置,则默认生成在build下:


    default.png

    GreenDao的基本配置就已经完成了,下面我们编写一个实体类。

    实体类User

      @Entity
      public class User {   
            @Id(autoincrement = true)   
            private Long id;   
            private String name;   
            private int age;
    }
    

    相关注解说明:

    • 实体@Entity注解

    schema:告知GreenDao当前实体属于哪个schema
    active:标记一个实体处于活跃状态,活动实体有更新、删除和刷新方法
    nameInDb:在数据库中使用的别名,默认使用的是实体的类名
    indexes:定义索引,可以跨越多个列
    createInDb:标记创建数据库表

    • 基础属性注解

    @Id:主键 Long 型,可以通过@Id(autoincrement = true)设置自增长
    @Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name")
    @NotNull:设置数据库表当前列不能为空
    @Transient:添加此标记后不会生成数据库表的列

    • 索引注解

    @Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
    @Unique:向数据库添加了一个唯一的约束

    • 关系注解

    @ToOne:定义与另一个实体(一个实体对象)的关系
    @ToMany:定义与多个实体对象的关系

    当我们编写好实体类并添加自己需要的注解之后,点击Make Project或者Make Module 'app',就会项目的build目录下或者自己设定的目录下看到生成的三个类文件:

    • DaoMaster
    • DaoSession
    • UserDao

    后面的数据库操作需要借助这三个类来进行,同时在我们的实体类中自动生成了各个属性的getset方法。

    build.png

    初始化GreenDao

    一般建议在Application中初始化数据库

    initial database.png
    DevOpenHelper有两个重载方法:
    • DevOpenHelper(Context context,String name)
    • DevOpenHelper(Context context,String name,CursorFactory factory)
      context上下文这个不用多说,name数据库的名字,cursorFactory游标工厂,一般不用,传入null或者使用两个参数的方法即可。我们对外提供一个getDaoSession()的方法供外部使用。

    注意:Long型id,如果传入null,则GreenDao会默认设置自增长的值。

    • insert(User entity):插入一条记录


      add user.png

    • deleteBykey(Long key) :根据主键删除一条记录。
    • delete(User entity) :根据实体类删除一条记录,一般结合查询方法,查询出一条记录之后删除。
    • deleteAll(): 删除所有记录。


      delete.png

    • update(User entity):更新一条记录


      update.png

    • loadAll():查询所有记录
    • load(Long key):根据主键查询一条记录
    • queryBuilder().list():返回:List<User>列表
    • queryBuilder().where(UserDao.Properties.Name.eq("")).list():返回:List<User>列表
    • queryRaw(String where,String selectionArg):返回:List<User>列表


      query.png

    总结

    至此,GreenDao的基本使用方法就这些了,后面还有一些关于数据的升级等问题,后面再具体介绍。

    相关文章

      网友评论

      • Wing_Li:关于数据的升级等问题,什么时候介绍?
      • 八怪不姓丑:我的不自动生成包,不知道为什么
        1732a43657c7:@八怪不姓丑我也遇到了这个问题。。。。请问什么叫mark?

        八怪不姓丑:@tonycheng93 好了,原来是没有mark:joy:
        往事都随风吧:rebuild之后也不生成吗
      • 程序猿老王:你好,请教个问题。如果entity里有个list<string>要怎么存储呢
        程序猿老王: @tonycheng93 谢谢,我试试
        往事都随风吧:GreenDao没办法直接存储List<String>,不过你可以这样做
        存数据:
        String arrayString = new Gson().toJson(yourArrayList);
        取数据的时候:
        Type listType = new TypeToken<ArrayList<String>>(){}.getType();
        List<String> arrayList = new Gson().fromJson(stringFromDb, listType)
      • 葉深秋:如果不同账号登录,为了数据好处理,我想以账号名创建各自的数据库,这样还合适在Application中初始化数据库吗
        往事都随风吧: @葉深秋 这样可能就不合适了,但是我觉得为每个用户建立独立数据库不太合适 ,创建过多数据库是比较耗资源的
      • 68ed210f942b:为什么两个都是在module:app下面
        68ed210f942b: @tonycheng93 嘿嘿谢谢分享
        往事都随风吧:放在Project和app下面都是可以的,两个我都实践过了,多谢提醒,我把两种都写上吧
      • 威威猫Alter:刚好急用,就喜欢这种说的简单的文章
        往事都随风吧:哈哈,谢谢支持,对你有帮助就好
      • 221716798db8:你好,我的按照你的配置出现了点问题,不知道是不是AS和gradle的问题(注:如果不设置生成路径就没有问题 ,一弄这个greendao{。。。。}就报下面的)
        Error:Unable to find method 'com.android.build.gradle.api.BaseVariant.getJavaCompiler()Lorg/gradle/api/Task;'.
        Possible causes for this unexpected error include:
        Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
        Re-download dependencies and sync project (requires network)
        The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
        Stop Gradle build processes (requires restart)
        Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.
        In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.
        往事都随风吧: @炫丽oo人生 把你的配置发出来看看
        炫丽oo人生:@tonycheng93 我也出现这个问题 请问怎么解决
        往事都随风吧:可能是添加的位置有问题,我把我的配置发给你,你再试一下,应该是没有问题的,我的是可以的。需要注意的是:greendao { } 需要放在 和 android { } 同一层级,而不是包含在 android 里面

      本文标题:GreenDao 3.2.0 的基本使用

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