1. 程式人生 > >專案實訓(六)greenDao存列表以及一對一關係的坑

專案實訓(六)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,也就沒問題了。