項目實訓(六)greenDao存列表以及一對一關係的坑

在更改數據庫結構,比如增加表修改字段什麼的首先要保證數據庫升級,否則會直接崩。

在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,也就沒問題了。

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