2016-11-08 77 views
2

在我的应用我有以下RealmObjects:如何只保存RealmObject而不是引用的对象

产品 - 这充当主数据不应该被修改。
购物车 - 购物车,让人们挑选的东西购买。内容将是选择类型。
选择 - 代表产品,用户选择旁边额外偏好,例如颜色,尺寸等

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

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

然后,如果我使用copyToRealm,我会得到产品 PrimaryKey异常。 由于我只想保存购物车和选择,我如何使产品的选择链接(用于阅读备份)但不保存。

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

回答

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` 
}); 
+0

我最终选择了后者。对我来说,主要的抱怨是现在我必须将产品和productId字段保留在Selection对象中。 – RobGThai

1

如果你不想存储产品,那么你只能保存其号您的对象中。如果您将使用copyToRealmOrUpdate - 您可能会意外更新您的对象,因为此方法执行深度复制。