ORM框架之GreenDao3.0集成与注解(一)

GreenDao简介

GreenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM数据库框架,本文将讲解如何集成GreenDao3.0环境,如何使用GreenDao自动生成代码及注解的使用。
  
GreenDao官网
GreenDao GitHub

GreenDao3.0优势

GreenDao相较于ORMLite等其他数据库框架有以下优势:

  1. 一个精简的库
  2. 性能最大化
  3. 内存开销最小化
  4. 易于使用的 APIs
  5. 对 Android 进行高度优化

而GreenDao3.0的版本主要使用注解方式定义实体类,通过gradle插件生成相应的代码。相较于3.0之前的版本集成步骤更为便捷,使用起来也更为简单。本文使用的版本为3.2.0。

集成

项目下build.gradle

GitHub中提示添加maven仓库,但是AndroidStudio项目已经默认包含了jcenter仓库,而jcenter仓库就是maven仓库的一个分支,因此不需要再添加仓库,直接添加classPath即可。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.2'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

app下build.gradle

在app下build.gradle文件中我们需要声明GreenDao插件,及配置GreenDao生成dao路径等信息,声明GreenDao依赖。

apply plugin: 'org.greenrobot.greendao'

......

greendao {
    schemaVersion 1 //数据库版本号    
    daoPackage 'com.holmeslei.greendaodemo.database' //设置时生成代码的目录    
    targetGenDir 'src/main/java' //设置DaoMaster、DaoSession、Dao目录   
    //targetGenDirTest:设置生成单元测试目录    
    //generateTests:设置自动生成单元测试用例
}

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

初始化实体

编写实体类

集成好使用环境后需要初始化实体,首先编写实体类。这里演示使用公司Company与雇员Employer实体例子。使用@Entity注解。莫急,注解机制在之后小节有详细讲解。

@Entity
public class Company {
    @Id(autoincrement = true) //自增
    private Long id; //主键
    private String companyName; //公司名称
    private String industry; //行业
    @ToMany(referencedJoinProperty = "companyId") //设置外键companyId
    private List<Employee> employeeList; //公司与雇员建立一对多关系
}
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id; //主键
    private long companyId; //指向Company主键
    private String employeeName; //雇员姓名
    private int salary; //薪水
}

生成代码

实体类与注解添加完毕后编译项目,就会为所有带注解的实体生成Dao文件,及DaoMaster与DaoSession。若未在build.gradle中配置过则默认生成目录为build/generated/source。若配置过则生成在配置的目录下。


编译项目

生成代码

注解

3.0之后最大的不同就是使用的注解来配置实体类属性,便捷且灵活。下面来看一下各类注解:

实体类注解
@Entity(
        schema = "myschema",
        active = true,       
        nameInDb = "AWESOME_USERS",
        indexes = {
                @Index(value = "name DESC", unique = true)
        },
        createInDb = false
)
public class Company {
    ......
}
  • @Entity:用于标识当前实体需要GreenDao生成代码。
  • schema:项目中存在多个Schema时,表明当前实体属于哪个Schema。
  • active:标记实体是否处于活动状态,活动状态才支持更新删除刷新等操作。
  • nameInDb:存储在数据库中的表名,不写默认与类名一致。
  • indexes:定义索引,可跨越多个列。
  • createInDb:标记创建数据库表,若有多个实体关联此表可设为false避免重复创建,默认为true。
属性注解
  • @Id :主键Long型,可以通过@Id(autoincrement = true)设置自增长。
  • @Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名例如@Property (nameInDb="name")
  • @NotNul:设置数据库表当前列不能为空。
  • @OrderBy:指定排序。
  • @Transient:添加此标记之后不会生成数据库表的列。
  • @Generated:为build之后GreenDao自动生成的注解,为防止重复,每一块代码生成后会加个hash作为标记。
索引注解
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    @Index(unique = true)
    private String industry;
}
 
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    @Unique 
    private String employeeName;
}
  • @Index:创建索引,通过设置name设置别名,设置unique添加约束。
  • @Unique:添加唯一约束与(unique = true)作用相同。
关系注解
  • @ToOne:定义与另一实体一对一的关联。
@Entity
public class Company {
    @Id (autoincrement = true)
    private Long id;
    private long customerId;
    @ToOne(joinProperty = "employeeId")
    private Employee employee;
}
  
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private String employeeName;
}
  • @ToMany:定义与多个实体对象一对多的关联,referencedJoinProperty为外键约束。
  • @JoinProperty:标明目标属性的源属性。
  • @JoinEntity:建立表连接关系。
//第一种:Employee实体通过外键companyId指向Company实体的主键Id建立一对多关联
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    private String companyName; 
    private String industry;
    @ToMany(referencedJoinProperty = "companyId")
    private List<Employee> employeeList;
}
  
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private long companyId;
    private String employeeName;
    private int salary;
}

//第二种:Employee以companyId为外键,与Company非主键不为空的键employeeTag建立一对多关联。
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    private String companyName; 
    private String industry;  
    @ToMany(joinProperties = {
            @JoinProperty(name = "employeeTag", referencedName = "companyId")
    })
    private List<Employee> employeeList;
}
  
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private String employeeName;
    private int salary;
    @NotNull 
    private String companyId;
}
 
//第三种:通过第三者实体类建立关联,用的较少
@Entity
public class Employee {
    @Id(autoincrement = true)
    private Long id;
    private String employeeName;
    private int salary;
  
    @ToMany
    @JoinEntity(
            entity = JoinEmployeeToCompany.class,
            sourceProperty = "employeeId",
            targetProperty = "companyId"
    )
    private List<Company> companyList;
}
  
@Entity
public class JoinEmployeeToCompany {
    @Id(autoincrement = true)
    private Long id;
    private Long employeeId;
    private Long companyId;
}
  
@Entity
public class Company {
    @Id(autoincrement = true)
    private Long id;
    private String companyName; 
    private String industry;  
}

总结

到此,这一篇关于GreenDao3.0的集成与注解就讲解完毕了,欢迎参看下一篇关于如何使用GreenDao3.0对数据库进行增删改查。

技术渣一枚,有写的不对的地方欢迎大神们留言指正,有什么疑惑或者不懂的地方也可以在我Github上GreenDaoDemo项目的Issues中提出,我会及时解答。

附上GreenDaoDemo的地址:
GreenDaoDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,262评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,838评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,693评论 18 139
  • GreenDao 介绍:greenDAO是一个对象关系映射(ORM)的框架,能够提供一个接口通过操作对象的方式去操...
    小董666阅读 736评论 0 1
  • 对于现在网上热传的鸡汤文和教程文来说,我用“请自己寻找”作标题显得有点不想混了的感觉。 想来想去,觉得还是用这个标...
    愤怒的老鸟阅读 231评论 0 0