中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

一個(gè)簡(jiǎn)單的Android SQLIte ORM框架

2018-07-20    來(lái)源:open-open

容器云強(qiáng)勢(shì)上線(xiàn)!快速搭建集群,上萬(wàn)Linux鏡像隨意使用
關(guān)于SQLite的ORM框架,目前有一些用得比較多的框架比如ORMlite,但是在公司做項(xiàng)目時(shí)由于公司的開(kāi)源政策,對(duì)開(kāi)源框架的檢查流程非常繁瑣, 需要一個(gè)專(zhuān)人投入半個(gè)月左右(不能忍),而根據(jù)我們項(xiàng)目的復(fù)雜度估測(cè),自己開(kāi)發(fā)的話(huà)半個(gè)月肯定就能搞定了(事實(shí)上一個(gè)禮拜的時(shí)候原型就出來(lái)了),下面我來(lái) 簡(jiǎn)單介紹一下我們的框架。代碼已經(jīng)放到github:https://github.com/chenyihan/Simple-SQLite-ORM- Android。
框架中提供了一個(gè)門(mén)面類(lèi)org.cyy.fw.android.dborm.sqlite.SqliteDBFacade來(lái)給調(diào)用者暴露一系列的增刪改查接口讓業(yè)務(wù)代碼能夠以更加OO的方式來(lái)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),在大部分情況下,這個(gè)類(lèi)時(shí)使用者唯一需要關(guān)注的框架類(lèi)。
框架通過(guò)四個(gè)java元注解來(lái)完成O-R映射:Table、Column、PrimaryKey、OneToAny。
@Table:作用在POJO類(lèi)上,通過(guò)它讓一個(gè)POJO類(lèi)和數(shù)據(jù)庫(kù)中的某個(gè)表關(guān)聯(lián),其中@Table的name屬性代表了映射的表的名稱(chēng),如果name屬性為空,那么把類(lèi)簡(jiǎn)名(不包含包名)當(dāng)做表名。

@Table(name = "t1")
public static class TestTable
{
}
上面的類(lèi)定義說(shuō)明TestTable類(lèi)會(huì)和t1表映射。
一個(gè)類(lèi)可以映射到DB中的多個(gè)表,實(shí)現(xiàn)這個(gè)特性的目的是因?yàn)槲覀兊捻?xiàng)目時(shí)一個(gè)客戶(hù)端項(xiàng)目,為了簡(jiǎn)化表結(jié)構(gòu)的設(shè)計(jì),比如我們的應(yīng)用中有很多歌曲界面,那么這些不同的歌曲界面都對(duì)應(yīng)一張單獨(dú)的表,這樣讓表設(shè)計(jì)更簡(jiǎn)單,增、刪、改、查邏輯也更簡(jiǎn)單。

@Table(name = { "t1", "t2", "t3" })
public static class TestTable {
    // ...
}
上面的類(lèi)定義表明TestTable類(lèi)會(huì)映射t1,t2,t3三張表,這時(shí)候通過(guò)TestTable調(diào)用增、刪、改、查API時(shí)需要指定要操作的表名。
@Column:作用在POJO類(lèi)的屬性上,讓屬性和表字段進(jìn)行映射,@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;
    }
}
上面類(lèi)定義中,屬性name映射到t1表的name1字段,屬性address是個(gè)非數(shù)據(jù)庫(kù)字段。
@PrimaryKey: 作用于POJO屬性,映射主鍵,和@Column用法差不多,但是它多幾個(gè)屬性,sequence,為true時(shí)表明該主鍵是自增型的,有DB自動(dòng)設(shè)置主 鍵的值。genUIDBySelf,true時(shí)表明主鍵值有框架自動(dòng)生成,sequence屬性在處理關(guān)聯(lián)的時(shí)候有寫(xiě)缺陷,推薦使用 genUIDBySelf屬性,由框架來(lái)生成主鍵值,下面是示例代碼。

@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的復(fù)雜對(duì)象或集合屬性上,指定表之間的一對(duì)一或一對(duì)多關(guān)聯(lián)關(guān)系,它有三個(gè)屬性:
target:關(guān)聯(lián)目標(biāo)表對(duì)應(yīng)的POJO class,當(dāng)@OneToAny作用的屬性是復(fù)雜對(duì)應(yīng)或者指定了泛型的集合(目前只支持List)屬性時(shí),該屬性可以省略不用指定,因?yàn)榭蚣軙?huì)自動(dòng)查找到。
sourceField:關(guān)聯(lián)源屬性,即用來(lái)拼接join部分的屬性,當(dāng)該屬性沒(méi)有被指定時(shí),框架把POJO的主鍵當(dāng)做關(guān)聯(lián)源屬性。
targetField:關(guān)聯(lián)目標(biāo)屬性,必須指定,用來(lái)拼接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;
    }
}
通過(guò)上面的類(lèi)定義,指定了表t1和c1的關(guān)聯(lián)關(guān)系,在查詢(xún)拼接SQL時(shí)拼出left join t1.id = c1.pid片段。
框架通過(guò)org.cyy.fw.android.dborm.AnnotationORMapper類(lèi)來(lái)實(shí)現(xiàn)注解映射邏輯,也可以通過(guò)實(shí)現(xiàn)org.cyy.fw.android.dborm.ORMapper接口來(lái)向框架注入特有的映射邏輯。
在定義POJO類(lèi)的時(shí)候需要注意:
(1)、遵守java bean規(guī)范,屬性應(yīng)該具有標(biāo)準(zhǔn)的setter和getter。
(2)、如果屬性是基本類(lèi)型,最好使用基本類(lèi)型的包裝類(lèi),否在在調(diào)用框架某些API時(shí)會(huì)出現(xiàn)問(wèn)題。
大部分情況下,org.cyy.fw.android.dborm.sqlite.SqliteDBFacade時(shí)使用者唯一需要接觸的類(lèi),它是一個(gè)抽象類(lèi),需要被繼承并且再做兩件額外的事情:
(1)、指定數(shù)據(jù)庫(kù)的名稱(chēng),SQLite會(huì)根據(jù)這個(gè)名稱(chēng)在應(yīng)用的databases目錄下創(chuàng)建一個(gè).db文件。
(2)、實(shí)現(xiàn)configureORMClasses方法,注冊(cè)所有需要參與ORM映射的POJO類(lèi)。
代碼已經(jīng)放到github:https://github.com/chenyihan/Simple-SQLite-ORM-Android

標(biāo)簽: 代碼 數(shù)據(jù)庫(kù)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:php提取圖片的主要顏色

下一篇:遍歷某文件夾下的所有文件和文件夾php代碼