在更改數據庫結構,比如增加表修改字段什麼的首先要保證數據庫升級,否則會直接崩。
在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,也就沒問題了。