專案實訓(六)greenDao存列表以及一對一關係的坑
阿新 • • 發佈:2019-02-19
在更改資料庫結構,比如增加表修改欄位什麼的首先要保證資料庫升級,否則會直接崩。
在app的gradle裡向上修改版本號即可,沒有的話加上,
greendao {
schemaVersion 2
}
原資料庫內容會清空。
1.我在這張表裡有一個List<String>和一個自定義object。list是不能直接存的,要藉助轉換器;
@Convert(columnType = String.class, converter = StringConverter.class)
private List<String> nickNames;
轉換器其實就是物件轉string和轉回來的策略:
public class StringConverter implements PropertyConverter<List<String>, String> { @Override public List<String> convertToEntityProperty(String databaseValue) { if (databaseValue == null) { return null; } else { List<String> list = Arrays.asList(databaseValue.split(",")); return list; } } @Override public String convertToDatabaseValue(List<String> entityProperty) { if(entityProperty==null){ return null; } else{ StringBuilder sb= new StringBuilder(); for(String link:entityProperty){ sb.append(link); sb.append(","); } return sb.toString(); } } }
2.一對一關係,表中含有另一個自定義的類物件UrlDBModel icon_url,需要建立對映關係。這裡是一對一的關係,所以註解是ToOne,註解中傳入的是外來鍵對應的名字,剛開始我以為框架會根據這個string自動在表中生成一個外來鍵欄位,這才混亂了,後來發現不是,這個字串對應的是你自己定義的一個存在的外來鍵,比如這裡我傳入了iconUrlId,那麼就要有一個Long iconUrlId。表中存的也就是這個外來鍵,對應UrlDBModel的主鍵,當然,UrlDBModel也要用框架註解生成表和工具類。
@ToOne(joinProperty = "iconUrlId") private UrlDBModel icon_url;
private Long iconUrlId;
接著我在使用insert插入資料行之後再取出的時候發現取出的UrlDBModel為空,後來發現是因為我在setUrlDBModel的時候傳入的UrlDBModel的id還是空的,來看一下框架生成的setter:
@Generated(hash = 1697832342)
public void setIcon_url(UrlDBModel icon_url) {
synchronized (this) {
this.icon_url = icon_url;
iconUrlId = icon_url == null ? null : icon_url.getId();
icon_url__resolvedKey = iconUrlId;
}
}
它沒有判斷id是否為空而是直接作為外來鍵了,接著看getter方法會發現它是根據這個外來鍵Id去UrlDBModel表中取,那麼也就肯定取不到了。
於是每次我都把時間戳作為id設定給UrlModel,先存進UrlModel中。然後在將其作為本表的欄位,儲存本表資料。這樣就確保本表可以通過外來鍵找到UrlModel,也就沒問題了。