2016-02-24 5 views
1

Прямо к коду. У нас есть два класса:Realm для Android: Храните объект не RealmObject внутри объекта RealmObject

class Rocket extends RealmObject 
{ 
@PrimaryKey 
private long id; 
private String name; 
private Payload pl; 
} 

class Payload 
{ 
private String name; 
private double mass; 
} 

Как хранить ракету в царстве?

  1. Я мог бы вручную сериализовать полезную нагрузку в виде строки, а затем сохранить ее вместе с Rocket. Но он медленный.
  2. Я мог бы расширить полезную нагрузку из RealmObject и сохранить ее в таблице. Но если я это сделаю, я должен удалить полезную нагрузку каждый раз, когда удаляю родительский Rocket. Это определенно не вариант, поскольку модель становится действительно грязной и сложной.

Я могу реализовать интерфейс Serializable или Parcelable, если он требует от меня, но мне действительно нужно сохранить свой объект в Царство.

спасибо.

ответ

1

Похоже, что ваша главная проблема с очевидным решением (расширение RealmObject) заключается в том, что вы хотите удалить Payload при удалении родителя Rocket. К сожалению, каскадные удаления are not yet supported. Ваши варианты:

  • сериализации в строку (обратите внимание, это должно быть сделано за пределами Rocket объекта)
  • сделать Payload расширить RealmObject и дать ему один и тот же первичный ключ, как ваши Rocket объектов, а затем удалить их в то же время (с помощью того же ключа)

Я рекомендую второе решение, наряду с методом что-то вроде следующего:

private void deleteRocket(long id) { 
    realm.where(Rocket.class).equalTo("id", id).findFirst().removeFromRealm(); 
    realm.where(Payload.class).equalTo("id", id).findFirst().removeFromRealm(); 
} 
+0

Благодарим вас за ответ. Мне не нужно каскадировать удаление родственников. Мне просто нужно сохранить структуру (класс с несколькими переменными-членами) внутри этого объекта db. Я мог бы реализовать интерфейс Serializable, если бы это было необходимо. Cascade delete является одним из нескольких вариантов реализации аналогичной функции путем хранения пользовательских RealmObjects. Но для этого должен быть более простой способ. Im разочаровал TBH. Но все же это хорошая БД. (Отмечено как принято, поскольку я не думаю, что есть более простой способ делать то, что я хочу.) – atomontage

+0

А, я вижу. Если вы [посмотрите этот ответ, который я оставил ранее, и комментарий от Christian Melchior] (http://stackoverflow.com/a/35592653/1217087), вы увидите, что пользовательские getters/seters (т.е. 'setPayload (полезная нагрузка p) ', где частный член является' String') в настоящее время не поддерживается, _but_ входят в 0.88. Таким образом, вы можете реализовать свою логику serialize/deserialize там, как только будет выпущено 0.88 (сейчас я вижу бета-снимок. –

+0

бета-снимок с поддержкой настраиваемых сеттеров/геттеров пока недоступен (5 февраля 2016 1:15 UTC). Но это очень скоро. См. Статус https://github.com/realm/realm-java/pull/2196 – beeender

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