如何只保存RealmObject但不保存引用的对象

时间:2016-11-08 12:06:42

标签: android realm realm-list

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

产品 - 此操作作为主数据,不应修改 购物车 - 购物车允许人们挑选买东西。内容将是选择类型 选择 - 代表用户选择的产品以及颜色,尺寸等额外偏好。

使用案例
用户选择产品并添加到购物车。产品包装在选择内部并存储在购物车内。说选择产品A,B和C.

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

然后,如果我使用copyToRealm,我会在产品上获得 PrimaryKey例外。 由于我想保存仅限购物车和选择,如何将选择链接到产品(用于回读备份)但不保存。

如果我使用copyToRealmOrUpdate,我是否会冒险意外更新产品?

2 个答案:

答案 0 :(得分: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`
});

答案 1 :(得分:1)

如果您不想存储产品,则只能将ID存储在对象中。如果您将使用copyToRealmOrUpdate - 您可能会意外更新您的对象,因为此方法会执行深层复制。