GreenDao3.0學習(To Many)

之前項目用objectbox,現在改成greendao,記錄一下自己用到的東西

導入

在build.gradle(app)下添加依賴

implementation 'org.greenrobot:greendao:3.2.2' // 添加依賴

同樣在當前頁面dependencies同級下添加

greendao {
    // 指定數據庫schema版本號,遷移等操作會用到
    schemaVersion 3
    // 設置生成數據庫文件的目錄,默認是在build中,可以將生成的文件放到我們的java目錄中
    targetGenDir 'src/main/java'
    // 設置生成的數據庫相關文件的包名,默認爲entity所在的包名
    daoPackage 'com.shufeng.greendao.gen'
}

還要在

apply plugin: 'com.android.application'下方添加
apply plugin: 'org.greenrobot.greendao' // 應用插件

在build.gradle(Project)下的dependencies下添加

// 添加插件
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

刷新項目,然後make project,就算導入完成了

entity

 

創建對應的entity

用@entity註解

@id註解主鍵

@Entity
public class Catalog implements Parcelable {

    @Id(autoincrement = true)
    public Long  id;

然後builde一下,會自動生成對應的dao

DaoMaster和DaoSession都會自動生成

使用的時候可以寫一個manager管理類

利用daosession獲取對應表的dao來使用

插入數據

Catalog  c = new Catalog ();

DataManager.getIntance.getCatalogDao().insert(c);

查詢有多種方式

DataManager.getIntance.getCatalogDao().loadAll();

DataManager.getIntance.getCatalogDao().querryBuilder().list();

DataManager.getIntance.getCatalogDao().querryBuilder().where(CatalogDao.Properties.id.eq(1)).list;

刪除delete

修改update

 

ToMany

根據官網文檔:https://greenrobot.org/greendao/documentation/relations/

tomany有三種方式,我使用的是第一種方式

第一種:

referencedJoinProperty 

指定目標實體中指向此實體id的“外鍵”屬性的名稱。

我使用時覺得就是將一個類的主鍵作爲另一個類的外鍵,將兩個或多個實例綁定

創建實體類father,使用referencedJoinProperty關聯屬性

創建實例son

兩個實例創建完成,make project,會自動生成對應的dao

插入son(ThreadPoolUtils是我的一個工具類)

插入father

查詢的方式有多種上面已經提了幾種

查詢son

查詢father

經管目前我還沒有將兩者關聯,但是reset方法同樣可以寫上,因爲to many關係是存在緩存的,就是會緩存上一次查詢的集合,我們需要reset方法清除緩存的集合

將部分son與father關聯

這時候再查詢father的時候,同樣要調用reset方法

查詢結果

解除關係和更換關係

只需要將待修改的son修改關聯的id爲目標id,然後更新數據庫裏面的數據

第二種:

JoinEntity 

如果要處理涉及另一個聯接實體/表的N:M(多對多)關係,請在屬性上添加此附加註釋。

使用的時候,用第三張表來保存兩張表對應的關係

創建customer實體類

創建order實體類

創建兩者關係的實體類

這個方法是N:N的方法,在order實體類裏面同樣可以加上joinEntity關鍵字

插入order

插入customer

將兩種實體類關聯

這樣將一部分的實體類關聯成功

查詢customer所包含的order時候,customer也要調用reset方法,然後直接get

更改關係和刪除關係,由於這種方法是N:M的,所以我用到的時候,反而是更換關係更多,值得注意的是,當我們執行更改關係的時候,可以說是新增關係,因爲如果不刪除原來的關係,那麼第三張關係表中會存在原來的關係

刪除關係

將當前的customer對象下的order清除

也可以單個刪除,將需要解除關係的集合delete,注意是對關係表操作,所以order表和customer表裏面的數據不會少

更換關係

將需要更換的order和新的customer綁定到第三張表裏

注意,order原本綁定關係不會覆蓋

如果想要刪除原本的關係,再更新到新的關係,這裏我目前沒有發現好的辦法,希望大家一起學習探討

 

第三種:

joinProperties 

對於更復雜的關係,可以指定@JoinProperty註釋的列表。每個@JoinProperty都需要原始實體中的源屬性和目標實體中的引用屬性。

這種方式和上面的區別在於,可以用不限於Long型作爲外鍵,可以使用其他的類型作爲外鍵

創建human實體類

這裏的joinProperty裏面,就是將本類的sex作爲源屬性,male是目標實體中的引用屬性,兩者相關聯

這裏我們用N:N,所以再創建一個man實體類

和human實體類一樣,這裏要注意,兩個表之間可以互相多對多,但是最好不要用同一個屬性,這樣在表查詢的時候,可能會出現數據錯亂

增刪的方法就是普通方法

將human插入到man

將man插入到human

這樣對應的數據是不會錯亂的,關係並沒有交叉

目前學到這些基礎的,後續還會深入學習

 

 

demo地址:https://github.com/erwoooo/DbGreen.git

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章