GreenDao簡介
GreenDao是一個將對象映射到SQLite數據庫中的輕量且快速的ORM數據庫框架宅荤,本文將講解如何集成GreenDao3.0環(huán)境屑迂,如何使用GreenDao自動生成代碼及注解的使用。
GreenDao官網
GreenDao GitHub
GreenDao3.0優(yōu)勢
GreenDao相較于ORMLite等其他數據庫框架有以下優(yōu)勢:
- 一個精簡的庫
- 性能最大化
- 內存開銷最小化
- 易于使用的 APIs
- 對 Android 進行高度優(yōu)化
而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'
}
初始化實體
編寫實體類
集成好使用環(huán)境后需要初始化實體前翎,首先編寫實體類稚配。這里演示使用公司Company與雇員Employer實體例子。使用@Entity注解港华。莫急道川,注解機制在之后小節(jié)有詳細講解。
@Entity
public class Company {
@Id(autoincrement = true) //自增
private Long id; //主鍵
private String companyName; //公司名稱
private String industry; //行業(yè)
@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:標記實體是否處于活動狀態(tài)迎献,活動狀態(tài)才支持更新刪除刷新等操作瞎访。
- nameInDb:存儲在數據庫中的表名,不寫默認與類名一致吁恍。
- indexes:定義索引装诡,可跨越多個列。
- createInDb:標記創(chuàng)建數據庫表践盼,若有多個實體關聯(lián)此表可設為false避免重復創(chuàng)建鸦采,默認為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:創(chuàng)建索引读恃,通過設置name設置別名,設置unique添加約束代态。
- @Unique:添加唯一約束與(unique = true)作用相同寺惫。
關系注解
- @ToOne:定義與另一實體一對一的關聯(lián)。
@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:定義與多個實體對象一對多的關聯(lián)蹦疑,referencedJoinProperty為外鍵約束西雀。
- @JoinProperty:標明目標屬性的源屬性。
- @JoinEntity:建立表連接關系歉摧。
//第一種:Employee實體通過外鍵companyId指向Company實體的主鍵Id建立一對多關聯(lián)
@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建立一對多關聯(lián)腔呜。
@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;
}
//第三種:通過第三者實體類建立關聯(lián),用的較少
@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