2016-06-21 110 views
0

我使用Realm作爲我的應用的數據庫。瞭解哪個表在全局領域發生了變化ChangeListener

我在我的數據庫中有幾個表 - 表1,表2,表3,表4和表5。
我有與表相同數量的活動,其中每個顯示其中一個表中的數據。

例如,
活性1將從表1顯示數據
活性2會從表2從表3中顯示數據
Activity3將顯示數據等

要儘快更新各自的活動如在其相應的表中的更改一些數據,我用我的領域實例註冊了一個RealmChangeListener。我在中心類中實例化了Realm。我不想在所有單獨的類中註冊RealmChangeListener,因爲註冊一次後,中央領域實例將更易於維護。

但是,在RealmChangeListener的onChange回調函數中,我得到了Realm對象,並且沒有辦法讓我知道哪些表中的數據實際發生了更改。

我正在添加如何實例化realm的代碼,並在下面註冊changeListener。

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? 

      } 
     }); 
    } 
} 

我的目標是通過LocalBroadcastManager發送廣播與信息有關該表的onChange從回調改變。所有的活動都會監聽這個廣播,如果表中與聽力活動相關的數據發生了變化,那麼它會自行更新。其餘的活動只會忽略廣播。我的目標是僅在應用程序中的一個位置監視數據庫更改,並只發送一個廣播以進行數據庫更改。處理數據庫更改的業務邏輯將取決於廣播中包含的信息。

我的問題是,是否有可能得到有關在RealmChangeListener中註冊的全局領域中修改了哪些表的通知?如果沒有,那麼是否有其他辦法可以實現我想要做的事情?

我一起工作:

境界 - 1.0.1
Android的工作室 - 2.1.2
民SDK - 19
目標SDK - 23

我測試我的應用程序在Android 5.1.1

感謝您提前提供的所有幫助。

回答

0

爲什麼不在應用中的相關RealmResults上註冊更改監聽器? Realm的設計是爲了在需要它們的地方註冊更改監聽器,因此對於此類通知應該是最無摩擦的。

但是,如果您決定去LocalBroadcastManager路由不能使用全局Realm來檢測哪些表更改。您需要爲已在模式中的每個表中選擇所有內容的查詢註冊更改偵聽器。您可以使用以下模式:

// 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

非常感謝你@Christian Melchior爲您的及時回覆!我想我會嘗試在每個活動的領域結果上註冊一個更改監聽器。然而,第二種方法似乎也很有趣。再次感謝您的幫助。 – rbing

相關問題