之前項目用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