一個簡單的Android SQLIte ORM框架
關于SQLite的ORM框架,目前有一些用得比較多的框架比如ORMlite,但是在公司做項目時由于公司的開源政策,對開源框架的檢查流程非常繁瑣, 需要一個專人投入半個月左右(不能忍),而根據我們項目的復雜度估測,自己開發的話半個月肯定就能搞定了(事實上一個禮拜的時候原型就出來了),下面我來 簡單介紹一下我們的框架。代碼已經放到github:https://github.com/chenyihan/Simple-SQLite-ORM- Android。
框架中提供了一個門面類org.cyy.fw.android.dborm.sqlite.SqliteDBFacade來給調用者暴露一系列的增刪改查接口讓業務代碼能夠以更加OO的方式來訪問數據庫,在大部分情況下,這個類時使用者唯一需要關注的框架類。
框架通過四個java元注解來完成O-R映射:Table、Column、PrimaryKey、OneToAny。
@Table:作用在POJO類上,通過它讓一個POJO類和數據庫中的某個表關聯,其中@Table的name屬性代表了映射的表的名稱,如果name屬性為空,那么把類簡名(不包含包名)當做表名。
@Table(name = "t1")
public static class TestTable
{
}
上面的類定義說明TestTable類會和t1表映射。
一個類可以映射到DB中的多個表,實現這個特性的目的是因為我們的項目時一個客戶端項目,為了簡化表結構的設計,比如我們的應用中有很多歌曲界面,那么這些不同的歌曲界面都對應一張單獨的表,這樣讓表設計更簡單,增、刪、改、查邏輯也更簡單。
@Table(name = { "t1", "t2", "t3" })
public static class TestTable {
// ...
}
上面的類定義表明TestTable類會映射t1,t2,t3三張表,這時候通過TestTable調用增、刪、改、查API時需要指定要操作的表名。
@Column:作用在POJO類的屬性上,讓屬性和表字段進行映射,@Column的name屬性指定映射的字段名,如果未指定,那么屬性名就是字段名。
@Table(name = "t1")
public static class TestTable {
@Column(name = "name1")
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
上面類定義中,屬性name映射到t1表的name1字段,屬性address是個非數據庫字段。
@PrimaryKey: 作用于POJO屬性,映射主鍵,和@Column用法差不多,但是它多幾個屬性,sequence,為true時表明該主鍵是自增型的,有DB自動設置主 鍵的值。genUIDBySelf,true時表明主鍵值有框架自動生成,sequence屬性在處理關聯的時候有寫缺陷,推薦使用 genUIDBySelf屬性,由框架來生成主鍵值,下面是示例代碼。
@Table(name = "t1")
public static class TestTable {
@PrimaryKey(columnName = "id1")
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
@OneToAny,作用于POJO的復雜對象或集合屬性上,指定表之間的一對一或一對多關聯關系,它有三個屬性:
target:關聯目標表對應的POJO class,當@OneToAny作用的屬性是復雜對應或者指定了泛型的集合(目前只支持List)屬性時,該屬性可以省略不用指定,因為框架會自動查找到。
sourceField:關聯源屬性,即用來拼接join部分的屬性,當該屬性沒有被指定時,框架把POJO的主鍵當做關聯源屬性。
targetField:關聯目標屬性,必須指定,用來拼接join。
@Table(name = "t1")
public static class TestTable {
@PrimaryKey(columnName = "id1", sequence = true)
private Integer id;
@OneToAny(targetField = "pid")
private List<Child> childList;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<Child> getChildList() {
return childList;
}
public void setChildList(List<Child> childList) {
this.childList = childList;
}
}
@Table(name = "c1")
public static class Child {
@PrimaryKey(columnName = "id1", sequence = true)
private Integer id;
@Column
private Integer pid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
}
通過上面的類定義,指定了表t1和c1的關聯關系,在查詢拼接SQL時拼出left join t1.id = c1.pid片段。
框架通過org.cyy.fw.android.dborm.AnnotationORMapper類來實現注解映射邏輯,也可以通過實現org.cyy.fw.android.dborm.ORMapper接口來向框架注入特有的映射邏輯。
在定義POJO類的時候需要注意:
(1)、遵守java bean規范,屬性應該具有標準的setter和getter。
(2)、如果屬性是基本類型,最好使用基本類型的包裝類,否在在調用框架某些API時會出現問題。
大部分情況下,org.cyy.fw.android.dborm.sqlite.SqliteDBFacade時使用者唯一需要接觸的類,它是一個抽象類,需要被繼承并且再做兩件額外的事情:
(1)、指定數據庫的名稱,SQLite會根據這個名稱在應用的databases目錄下創建一個.db文件。
(2)、實現configureORMClasses方法,注冊所有需要參與ORM映射的POJO類。
代碼已經放到github:https://github.com/chenyihan/Simple-SQLite-ORM-Android
框架中提供了一個門面類org.cyy.fw.android.dborm.sqlite.SqliteDBFacade來給調用者暴露一系列的增刪改查接口讓業務代碼能夠以更加OO的方式來訪問數據庫,在大部分情況下,這個類時使用者唯一需要關注的框架類。
框架通過四個java元注解來完成O-R映射:Table、Column、PrimaryKey、OneToAny。
@Table:作用在POJO類上,通過它讓一個POJO類和數據庫中的某個表關聯,其中@Table的name屬性代表了映射的表的名稱,如果name屬性為空,那么把類簡名(不包含包名)當做表名。
@Table(name = "t1")
public static class TestTable
{
}
上面的類定義說明TestTable類會和t1表映射。
一個類可以映射到DB中的多個表,實現這個特性的目的是因為我們的項目時一個客戶端項目,為了簡化表結構的設計,比如我們的應用中有很多歌曲界面,那么這些不同的歌曲界面都對應一張單獨的表,這樣讓表設計更簡單,增、刪、改、查邏輯也更簡單。
@Table(name = { "t1", "t2", "t3" })
public static class TestTable {
// ...
}
上面的類定義表明TestTable類會映射t1,t2,t3三張表,這時候通過TestTable調用增、刪、改、查API時需要指定要操作的表名。
@Column:作用在POJO類的屬性上,讓屬性和表字段進行映射,@Column的name屬性指定映射的字段名,如果未指定,那么屬性名就是字段名。
@Table(name = "t1")
public static class TestTable {
@Column(name = "name1")
private String name;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
上面類定義中,屬性name映射到t1表的name1字段,屬性address是個非數據庫字段。
@PrimaryKey: 作用于POJO屬性,映射主鍵,和@Column用法差不多,但是它多幾個屬性,sequence,為true時表明該主鍵是自增型的,有DB自動設置主 鍵的值。genUIDBySelf,true時表明主鍵值有框架自動生成,sequence屬性在處理關聯的時候有寫缺陷,推薦使用 genUIDBySelf屬性,由框架來生成主鍵值,下面是示例代碼。
@Table(name = "t1")
public static class TestTable {
@PrimaryKey(columnName = "id1")
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
@OneToAny,作用于POJO的復雜對象或集合屬性上,指定表之間的一對一或一對多關聯關系,它有三個屬性:
target:關聯目標表對應的POJO class,當@OneToAny作用的屬性是復雜對應或者指定了泛型的集合(目前只支持List)屬性時,該屬性可以省略不用指定,因為框架會自動查找到。
sourceField:關聯源屬性,即用來拼接join部分的屬性,當該屬性沒有被指定時,框架把POJO的主鍵當做關聯源屬性。
targetField:關聯目標屬性,必須指定,用來拼接join。
@Table(name = "t1")
public static class TestTable {
@PrimaryKey(columnName = "id1", sequence = true)
private Integer id;
@OneToAny(targetField = "pid")
private List<Child> childList;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<Child> getChildList() {
return childList;
}
public void setChildList(List<Child> childList) {
this.childList = childList;
}
}
@Table(name = "c1")
public static class Child {
@PrimaryKey(columnName = "id1", sequence = true)
private Integer id;
@Column
private Integer pid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
}
通過上面的類定義,指定了表t1和c1的關聯關系,在查詢拼接SQL時拼出left join t1.id = c1.pid片段。
框架通過org.cyy.fw.android.dborm.AnnotationORMapper類來實現注解映射邏輯,也可以通過實現org.cyy.fw.android.dborm.ORMapper接口來向框架注入特有的映射邏輯。
在定義POJO類的時候需要注意:
(1)、遵守java bean規范,屬性應該具有標準的setter和getter。
(2)、如果屬性是基本類型,最好使用基本類型的包裝類,否在在調用框架某些API時會出現問題。
大部分情況下,org.cyy.fw.android.dborm.sqlite.SqliteDBFacade時使用者唯一需要接觸的類,它是一個抽象類,需要被繼承并且再做兩件額外的事情:
(1)、指定數據庫的名稱,SQLite會根據這個名稱在應用的databases目錄下創建一個.db文件。
(2)、實現configureORMClasses方法,注冊所有需要參與ORM映射的POJO類。
代碼已經放到github:https://github.com/chenyihan/Simple-SQLite-ORM-Android
本文由用戶 n7w77 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!