プロジェクト実習(六)greenDaoメモリリストと一対一の関係のピット
2503 ワード
テーブルの変更フィールドを追加するなど、データベース構造を変更するには、まずデータベースのアップグレードを保証します.そうしないと、直接崩壊します.
appのgradleでバージョン番号を上に修正すればいいのですが、なければ追加して、
元のデータベースの内容が空になります.
1.私はこの表にリストとカスタムobjectを持っています.Listは直接保存できません.コンバータを借ります.
変換器は、オブジェクトがstringを回転し、戻ってくるポリシーです.
2.別のカスタムクラスオブジェクトUrlDBModel icon_を含む一対一の関係url、マッピング関係を確立する必要があります.ここは一対一の関係なので、注釈はToOneで、注釈には外部キー対応の名前が入っています.最初はフレームワークがこのstringに基づいて自動的にテーブルに外部キーフィールドを生成すると思っていましたが、混乱しました.その後、いいえ、この文字列はあなたが定義した存在する外部キーに対応しています.例えば、ここでiconUrlIdを渡したら、Long iconUrlIdが必要です.テーブルに格納されているのはこの外部キーであり,UrlDBModelのプライマリキーに対応しているが,もちろん,UrlDBModelもフレーム注釈でテーブルとツールクラスを生成する.
次にinsertを使用してデータ行を挿入して取り出したときに取り出したUrlDBMModelが空であることを発見し、seturlDBMModelの時に入ってきたUrlDBMModelのidが空であるためか、フレームワーク生成のsetterを見てみましょう.
idが空かどうかを判断するのではなく、直接外部キーとして機能しているので、getterメソッドを見てみると、この外部キーIdに基づいてUrlDBMModelテーブルに取りに行ったので、取れないに違いありません.
そこで毎回タイムスタンプをidとしてUrlModelに設定し、先にUrlModelに保存します.次に、このテーブルのフィールドとして、このテーブルのデータを格納します.このようにして、このテーブルが外部キーでUrlModelを見つけることができることを確認すれば、問題ありません.
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を見つけることができることを確認すれば、問題ありません.