RealmObject И Parcelable

Нов съм в Realm за Android, така че не съм сигурен, че подхождам към това по правилния начин. Имам клас, който изглежда така:

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

Проблемът е, че интерфейсът Parcelable съдържа методи като describeContents() writeToParcel() и RealmObjects не трябва да имат методи, различни от getters и setters:

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 за съхраняване на обекти в db   -  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. com/questions/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

Решение с Kotlin:

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