プロジェクト実習(六)greenDaoメモリリストと一対一の関係のピット

2503 ワード

テーブルの変更フィールドを追加するなど、データベース構造を変更するには、まずデータベースのアップグレードを保証します.そうしないと、直接崩壊します.
appのgradleでバージョン番号を上に修正すればいいのですが、なければ追加して、

greendao {
    schemaVersion 2
}

元のデータベースの内容が空になります.
 
1.私はこの表にリストとカスタムobjectを持っています.Listは直接保存できません.コンバータを借ります.
 @Convert(columnType = String.class, converter = StringConverter.class)
    private List nickNames;

変換器は、オブジェクトがstringを回転し、戻ってくるポリシーです.
public class StringConverter implements PropertyConverter, String> {

    @Override
    public List convertToEntityProperty(String databaseValue) {
        if (databaseValue == null) {
            return null;
        }
        else {
            List list = Arrays.asList(databaseValue.split(","));
            return list;
        }
    }

    @Override
    public String convertToDatabaseValue(List 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を使用してデータ行を挿入して取り出したときに取り出したUrlDBMModelが空であることを発見し、seturlDBMModelの時に入ってきたUrlDBMModelの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に基づいてUrlDBMModelテーブルに取りに行ったので、取れないに違いありません.
そこで毎回タイムスタンプをidとしてUrlModelに設定し、先にUrlModelに保存します.次に、このテーブルのフィールドとして、このテーブルのデータを格納します.このようにして、このテーブルが外部キーでUrlModelを見つけることができることを確認すれば、問題ありません.