2017-09-16 2 views
0

Jetzt versuche ich zu verstehen, wie Realm mit RxJava2 zu verwenden ist. Es gibt nicht viele Informationen. Zum Beispiel habe ich eine einfache Abfrage:Realm + RxJava2 Wie benutze ich equalTo und etc

CommentObject firstComments = realmForThisThread.where(CommentObject.class) 
       .equalTo(CommentObject.COMMENT,comment).findFirst(); 

Wie bekomme ich FirstComment mit RxJava2? Wie ich verstehe, funktioniert die as Observable Methode jetzt nicht.

Die gleichen Fragen werden angezeigt, wenn ich RealmResults abrufen oder Listener nur für ein Modell und nicht für alle Realm-Datenbanken festlegen möchte.

Gibt es Dokumente über Realm + RxJava2? Ich habe nur RxJava gefunden, muss es aber nicht. Vorher arbeitete ich mit Realm ohne Rx, aber jetzt ist es wichtig, dieses Konzept zu verwenden

+0

drehen ist nur synchrone Abfrage für eine Realm-Instanz . Es gibt keinen Grund dafür, dass Rx darin enthalten ist, wenn keine Change-Listener (oder Thread-Sprünge, die sowieso mit verwalteten Realmobjekten verboten sind) beteiligt sind. – EpicPandaForce

+0

@ EpicPandaForce Bedeutet das, dass ich Rx verwenden muss, wenn ich RealmChangeListener verwende, zum Beispiel im Recycler-Adapter? Im anderen Fall kann ich clean realm Methode ohne Rx (zum Kopieren, Suchen, Speichern von Daten) verwenden? – Delphian

+0

Sie können jeden 'RealmChangeListener 'mit' fließfähigem 'ersetzen, aber ein RecyclerAdapter ist eigentlich ein lustiges Beispiel, weil Realm bereits' RealmRecyclerViewAdapter' gibt, der den zu den Ergebnissen hinzugefügten Listener intern verwaltet – EpicPandaForce

Antwort

2

Sie können meinen Artikel auf using Realm with RxJava2 in the Realm Academy lesen.


Synchrone einwertige Abfrage ist nicht sinnvoll, als Observable ausgesetzt werden.

Wenn Sie hören möchten, ob es ein 0 oder 1 Element eines RealmObject gibt, dann sollten Sie RealmResults<T>.asFlowable() verwenden.

Die Verwendung von RealmObject.asFlowable() dient zum Abhören von Einzelelement-Objektbenachrichtigungen, die auch Feldänderungen ermöglichen.


Sowieso RxJava2 Verwendung ist, damit Sie dieses Bild Dieser

public class MyActivity extends AppCompatActivity { 
    Realm realm; 
    RealmResults<Task> results; // kept as strong reference! 
    RealmChangeListener<RealmResults<Task>> listener = new RealmChangeListener<RealmResults<Task>>() {   
     @Override 
     public void onChange(RealmResults<Task> results) { 
      if(results.isLoaded()) { 
       // results is always up to date here 
       // after a write to Realm from ANY thread! 
       updateUi(results); 
      } 
     } 
    } 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 
     ButterKnife.bind(this); 

     realm = Realm.getDefaultInstance(); 
     results = realm.where(Task.class) 
           .findAllSortedAsync(TaskFields.ID); 
            // TaskFields is generated 
            // using https://github.com/cmelchior/realmfieldnameshelper 
     results.addChangeListener(listener); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     results.removeChangeListener(listener); 
     results = null; 
     realm.close(); 
    } 

    private void updateUi(List<MyObject> objects) { 
     // do something 
    } 
} 

in diese

@Singleton 
public class TaskRepository { 
    @Inject 
    public TaskRepository() { 
    } 

    // this implementation works on any thread. 
    public Flowable<List<Task>> getTasks(Realm realm) { 
     if(realm.isAutoRefresh()) { // for looper threads 
      return realm.where(Task.class) 
        .findAllSortedAsync(TaskFields.ID) 
        .asFlowable() 
        .filter(RealmResults::isLoaded); 
     } else { // for background threads 
      return Flowable.just(realm.where(Task.class).findAllSorted(TaskFields.ID)); 
     }      
    } 
} 

und

public class MyActivity extends AppCompatActivity { 
    TaskRepository taskRepository; 

    Realm realm; 
    Disposable subscription; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 
     ButterKnife.bind(this); 

     realm = Realm.getDefaultInstance(); 
     taskRepository = Injector.get().taskRepository(); 
     subscription = taskRepository.getTasks().subscribeWith(tasks -> { 
      updateUi(tasks); 
     }); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 
     subscription.dispose(); 
     subscription = null; 
     realm.close(); 
    } 

    private void updateUi(List<MyObject> objects) { 
     // do something 
    } 
} 
+0

Vielen Dank, schönes Beispiel. Ich habe den obigen Artikel gelesen, aber manchmal braucht es mehr Zeit und mehr Beispiele, um zu verstehen, wie man es besser macht. – Delphian