Wpis z mikrobloga

#programowanie #realm #androiddev
Dzis zaczalem przygode z realm. Wszyscy mowią ze takich och ach.. a mnie wkurza od dobrych dwoch godzin. W ciagu kilku chwil napotkałem kilka problemów.

Aplikacja nad ktora pracuje wykorzystuje RxJava2 (Realm wspiera RxJava1)... uzywamy Rx do miedzy innymi przerzucania czesci zadan by wykonywały sie w innym wątku.

Problem mam gdy chce skorzystac z Realm w wątku. Rzuca mi błędem ze nie moge tego zrobić, bo instancja do Realm zostala stworzona w innym watku.
Jak mam wyciagniety obiekt z bazy danych, i wypluty np z Rx (stworzony w innym watku), to nie moge np zmienic jakiegos pola w tym obiekcie, bo rzuca mi wyjatek ze musze to zrobic "w transkacji" a tej nie moge otworzyć, bo obiekt był stworzony w innym wątku.

Czy serio za kazdym razem jak chce cos zrobic na tabeli to musze tworzyc nowy obiekt Realm'a, dopiero wtedy wyciagnac obiekt z bazy i wykonać na nim jakąs akcję?! jak bede chcial przerzucic taki obiekt do wątku UI, to bede musial go przepisac na inny obiekt?

a moze ja robie cos zle?
  • 4
@Mithrindil: No wlanie mam wstrzykiwanie... lecz w zadnej zaleznosci nie moge po prostu sobie zapisac obiektu Realm albo pozyskanego z bazy obiektu, bo jak przerzuce to do innego watku, to leci mi exception

Przykładowao mam Observabla z obiektem z bazy, robie na tym observable operacje długotrawala - jakies mapowanie, request do serwera, obojętne - robie to na osobnym watku, a wynik obserwuje w UI... obiektem zwracanym bylby jakis element z bazy...
@PanBaklazan: Dawno nie używałem Realm ale też trochę się irytowałem przy nim.
Robiłem to mniej więcej w ten sposób, również używałem Rx i nie miałem problemów. Pamiętaj o '[at]PrimaryKey'.

public List getFoos() {
RealmResults realmResult = mRealm.where(Foo.class).findAll();
List result = Collections.emptyList();

if (realmResult.isValid()) {
result = mRealm.copyFromRealm(realmResult);
}
return result;
}

public void updateFoo(Foo foo) {
mRealm.executeTransaction(realm -> realm.copyToRealmOrUpdate(foo));
}

public void setFoos(List foos) {
mRealm.executeTransaction(realm -> realm.copyToRealmOrUpdate(foo));
}
@czlowiek-z-neptuna: czyli mówisz że rozwiązaniem jest kopiowanie obiektu. No teraz mi to trochę sensowniej wygląda. Lecz nadal mam obawy co do tej multi watkowosci. Do każdego zaciągnięcia czegoś z bazy będę musiał napisać sobie jakiś manager. Trochę zachodu. Chyba na ten projekt wrócę jeszcze do greendao.
Jakiej bazy obecnie używasz?