2016-06-21 1 views
0

Ich verwende Realm als Datenbank für meine App.Wissen, welche Tabelle im globalen Realm geändert wurdeChangeListener

Ich habe einige Tabellen in meiner Datenbank say- Table1, Table2, Table3, Table4 und Table5.
Ich habe die gleiche Anzahl von Aktivitäten wie Tabellen, von denen jede die Daten aus einer der Tabellen anzeigt.

Für z.
Activity1 würde Daten von Tabelle 1 zeigt
Activity2 Daten aus Tabelle 2
anzeigen würde Aktivität3 würde Daten aus Tabelle 3 angezeigt werden und so weiter

jeweilige Aktivität, sobald einige Daten in seiner entsprechenden Tabellenänderung zu aktualisieren Ich habe einen RealmChangeListener mit meiner Realm-Instanz registriert. Ich instanziiere Realm in einer zentralen Klasse. Ich möchte RealmChangeListener nicht in allen einzelnen Klassen registrieren, da eine einmalige Registrierung mit der zentralen Realm-Instanz wartungsfreundlicher wäre.

Allerdings, in der OnChange-Rückruf des RealmChangeListener, bekomme ich das Realm-Objekt zurück und es gibt keine Möglichkeit für mich zu wissen, dass Daten in welcher Tabelle tatsächlich geändert.

Ich füge den Code, wie ich Realm instanziieren und den ChangeListener unten registrieren.

MyApplication.java

public class MyApplication extends Application{ 

     @Override 
     public void onCreate() { 
     super.onCreate(); 
     MainClass mainClass = new MainClass(getApplicationContext()); 
     } 
} 

MainClass.java

public class MainClass{ 
    public MainClass(Context context){ 
     RealmConfiguration config = new RealmConfiguration.Builder(context).build(); 
     Realm realm = Realm.getInstance(config); 
     realm.addChangeListener(new RealmChangeListener<Realm>() { 
      @Override 
      public void onChange(Realm element) { 

       //is it possible to know here that data for which table changed? 

      } 
     }); 
    } 
} 

Mein Ziel ist es, eine Sendung über LocalBroadcastManager mit Informationen zukommen zu lassen in Bezug auf die Tabelle von onChange Rückruf geändert. Alle Aktivitäten würden auf diese Übertragung warten, und wenn sich die Daten in der Tabelle, die der Listening-Aktivität zugeordnet ist, geändert haben, würde sie sich selbst aktualisieren. Die restlichen Aktivitäten würden die Übertragung einfach ignorieren. Mein Ziel ist es, Datenbankänderungen nur von einem Ort in meiner App aus zu überwachen und nur einen Broadcast für eine Datenbankänderung zu senden. Die Geschäftslogik für die Datenbankänderung hängt von den in der Übertragung enthaltenen Informationen ab.

Meine Frage wäre, ist es möglich, benachrichtigt zu werden, welche Tabelle in der RealmChangeListener geändert wurde, die mit dem globalen Bereich registriert wurde? Wenn nicht, gibt es dann Alternativen, um das zu erreichen, was ich tun möchte?

mit denen ich arbeite:

Realm - 1.0.1
Android Studio - 2.1.2
Min SDK - 19
Ziel SDK - 23

Ich teste meine App auf Android 5.1.1

Vielen Dank für die Hilfe im Voraus.

Antwort

0

Warum registrieren Sie nicht einfach einen Änderungslistener in den relevanten RealmResults in Ihrer App? Realm ist so konzipiert, dass Änderungslistener dort registriert werden, wo sie für diese Art von Benachrichtigungen am reibungslosesten sind.

Aber wenn Sie sich entscheiden, die LocalBroadcastManager-Route zu gehen, kann nicht das globale Realm verwenden, um zu erkennen, welche Tabellen geändert wurden. Sie müssen einen Änderungslistener für eine Abfrage registrieren, die in jeder Tabelle in Ihrem Schema alles ausgewählt hat. Sie können das folgende Muster verwenden:

// OnCreate 
    DynamicRealm realm = DynamicRealm.getInstance(realmConfig); 
    RealmSchema schema = realm.getSchema(); 
    List<RealmResults<DynamicRealmObject>> strongRefs = new ArrayList<>(); 
    for (final RealmObjectSchema classSchema : schema.getAll()) { 
     // Create a RealmResults for all elements in a Table 
     RealmResults<DynamicRealmObject> result = realm.where(classSchema.getClassName()).findAll(); 
     // Register a changelistener for that realm result 
     result.addChangeListener(new RealmChangeListener<RealmResults<DynamicRealmObject>>() { 
      @Override 
      public void onChange(RealmResults<DynamicRealmObject> element) { 
       Intent intent = new Intent("custom-event-name"); 
       intent.putExtra("classChanged", classSchema.getClassName()); 
       LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
      } 
     }); 
     strongRefs.add(result); // Make sure that RealmResults are not GC'ed 
    } 


    // onDestroy 
    for (RealmResults<DynamicRealmObject> strongRef : strongRefs) { 
     strongRef.removeChangeListeners(); 
    } 
+0

Vielen Dank @Christian Melchior für Ihre schnelle Antwort! Ich denke, ich werde versuchen, einen Change-Listener für die Realm-Ergebnisse in jeder Aktivität zu registrieren. Der zweite Ansatz erscheint jedoch auch interessant. Danke nochmal für die Hilfe. – rbing

Verwandte Themen