2016-11-08 1 views
2

В моем приложении я имеет следующие RealmObjects:Как сохранить только RealmObject, но не ссылается объект

Продукта - этот акт как основные данные и никогда не должен быть изменен.
Корзина - Корзина, чтобы люди могли выбирать вещи для покупки. Содержимое будет типом выбора.
Выбор - Представляют продукт, который пользователь выбрал рядом дополнительных настроек, таких как цвет, размер и т.д.

Use Case
пользователя выбрать продукт и добавьте в корзину. Продукт обернут внутри выбора и хранится внутри корзины. Скажите выбор продукта A, B и C.

Теперь, чтобы сохранить это в Царстве. Документ говорит мне использовать RealmList, чтобы добавить отношения. Это делает Cart -> List; Выбор -> Продукт.

Тогда, если я использую copyToRealm, я получу Исключение PrimaryKey на продукте. Поскольку я хочу сэкономить только Корзина и выбор, как мне сделать ссылку на ссылку на продукт (для чтения), но не сохранить его.

Если я использую copyToRealmOrUpdate, могу ли я случайно повредить продукт?

ответ

2

Вы можете создать объект RealmObject явно внутри Realm с самого начала и установить ссылку объекта на управляемый объект внутри вашего управляемого объекта.

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

В итоге я перешел к последнему варианту. Основная проблема для меня - теперь я должен держать поле product и productId в объекте Selection. – RobGThai

1

Если вы не хотите хранить продукт, то вы можете хранить только он Идентификаторы внутри объектов. Если вы будете использовать copyToRealmOrUpdate - вы можете случайно обновить свой объект, потому что этот метод выполняет глубокую копию.

Смежные вопросы