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