2

私のアプリには、次の RealmObjects があります。

製品- これはマスター データとして機能し、決して変更しないでください。
カート- 人々が購入するものを選択できるようにするショッピング カート。内容はセレクション型となります。
選択- ユーザーが色、サイズなどの追加設定とともに選択した製品を表します。

ユースケース
ユーザーが製品を選択してカートに追加します。製品はセレクション内に包まれ、カート内に保管されます。製品 A、B、および C を選択します。

これを Realm に保存します。ドキュメントにはRealmList、関係を追加するために使用するように指示されています。これにより、カート -> リストが作成されます。選択 -> 製品。

次に、を使用するcopyToRealmと、Product で PrimaryKey 例外が発生しますCart と Selection のみを保存したいので、 Selectionを Product にリンクするにはどうすればよいですか (バックアップを読み取るため)、保存はしません。

を使用する場合copyToRealmOrUpdate、誤って製品を更新する危険がありますか?

4

2 に答える 2

2

最初から Realm 内に RealmObject を明示的に作成し、管理対象オブジェクト内の管理対象オブジェクトへのオブジェクト リンクを設定できます。

realm.executeTransaction((realm) -> {
    // ASSUMING PRIMARY KEY
    Selection selection = realm.where(Selection.class).equalTo(SelectionFields.ID, selectionId).findFirst();
    if(selection == null) {
       selection = realm.createObject(Selection.class, selectionId);
    }
    // here, selection is always managed

    //...
    Product product = realm.where(Product.class)./*...*/.findFirst();
    selection.setProduct(product);

    // no insertOrUpdate()/copyToRealmOrUpdate() call for `selection`
});

ただし、プロキシをマネージドに変更した後にのみ製品リンクを設定することもできます。

realm.executeTransaction((realm) -> {
    Selection selection = new Selection();

    // assuming selection.getProduct() == null

    selection = realm.copyToRealmOrUpdate(selection);
    // selection is now managed

    Product product = realm.where(Product.class)./*...*/.findFirst();
    selection.setProduct(product);

    // no insertOrUpdate()/copyToRealmOrUpdate() call for `selection`
});
于 2016-11-08T13:01:24.363 に答える
1

製品を保存したくない場合は、オブジェクト内に ID のみを保存できます。- を使用する場合copyToRealmOrUpdate、このメソッドはディープ コピーを実行するため、誤ってオブジェクトを更新する可能性があります。

于 2016-11-08T13:02:03.643 に答える