2

在我的应用程序中,我有以下 RealmObjects:

产品- 这充当主数据,永远不应修改。
购物车- 购物车,允许人们挑选要购买的东西。内容将是选择类型。
选择- 表示用户选择的产品以及颜色、尺寸等额外偏好。

用例
用户选择产品并添加到购物车。产品被包裹在 Selection 中并存储在 Cart 中。说选择产品 A、B 和 C。

现在将其保存到 Realm 中。文档告诉我使用RealmList添加关系。这使得购物车 -> 列表;选择 -> 产品。

然后,如果我使用copyToRealm,我将在 Product 上获得 PrimaryKey 异常。由于我只想保存Cart 和 Selection,如何将 Selection 链接到 Product(用于阅读备份)但不保存它。

如果我使用copyToRealmOrUpdate,是否有意外更新产品的风险?

4

2 回答 2

2

您可以从一开始就在领域内显式创建领域对象,并将对象链接设置为托管对象内的托管对象。

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 回答