RealmObject И Parcelable

Я новичок в Realm для Android, поэтому не уверен, что подхожу к этому правильно. У меня есть класс, который выглядит так:

public class Entry extends RealmObject implements Parcelable {
    ...
}

Проблема в том, что интерфейс Parcelable содержит такие методы, как describeContents() writeToParcel(), а у RealmObjects не должно быть методов, отличных от геттеров и сеттеров:

Error:(81, 17) error: Only getters and setters should be defined in model classes

Итак, мой вопрос: как я могу заставить эти два работать вместе? Есть ли лучший способ, чем создать отдельный класс (может быть, что-то вроде RealmEntry)? Это приведет к большому количеству дублированного кода...


person frankelot    schedule 01.12.2014    source источник
comment
Почему вы пытаетесь использовать объекты Parcelable и Realm?   -  person Orgmir    schedule 01.12.2014
comment
Что ж, я использую Pareclable для сохранения объектов при изменении конфигурации (поворотах устройств) и Realm для хранения объектов в базе данных.   -  person frankelot    schedule 01.12.2014
comment
Не будет ли разумнее просто запросить базу данных после изменения конфигурации? Это может быть даже быстрее, учитывая, что вы используете RealmDB с механизмами кэширования.   -  person A. Steenbergen    schedule 21.03.2018


Ответы (4)


Теперь для этого есть другой обходной путь: просто реализуйте интерфейс RealmModel вместо расширения от RealmObject:

@RealmClass
public class User implements RealmModel {

}

Дополнительную информацию можно найти в документации Realm.

person Henrique de Sousa    schedule 20.05.2016
comment
Но стоит ли использовать разделяемые объекты для хранения данных? - person aleien; 30.05.2016
comment
обратитесь к этому ответу: stackoverflow. ком/вопросы/8896751/ - person Henrique de Sousa; 01.06.2016

ОБНОВЛЕНИЕ, май 2016 г. Этот ответ устарел, если вы уже не используете Parceler. Решение @Henrique de Sousa намного лучше.


На самом деле, есть обходной путь. Вы можете получить желаемый результат, если захотите использовать стороннюю библиотеку (Parceler) для генерации Parcelable. См. мой ответ на этот другой вопрос, приведенный ниже для удобства.

С Parceler v0.2.16 вы можете сделать следующее:

@RealmClass      // required if using JDK 1.6 (unrelated to Parceler issue)
@Parcel(value = Parcel.Serialization.BEAN, analyze = { Feed.class })
public class Feed extends RealmObject {
    // ...
}

Затем везде используйте Parcels.wrap(Feed.class, feed) вместо Parcels.wrap(feed), иначе ваше приложение вылетит с org.parceler.ParcelerRuntimeException: Unable to create ParcelableFactory for io.realm.FeedRealmProxy.

person Vicky Chijwani    schedule 18.04.2015

На данный момент невозможно реализовать Parcelable на RealmObjects. Одним из решений является использование двух файлов области: один по умолчанию в качестве хранилища объектов и специализированный для временных сохранений для поворотов и т. д.

person Emanuelez    schedule 03.12.2014

Решение с Котлином:

import io.realm.com_labtest_di_model_EntryRealmProxy
import org.parceler.Parcel


@RealmClass
@Parcel(implementations = arrayOf(com_labtest_di_model_EntryRealmProxy::class),
    value = org.parceler.Parcel.Serialization.BEAN,
    analyze = arrayOf(Movie::class))
open class Entry() : RealmObject() {
...
person Ricardo    schedule 12.03.2019