2016-06-21 12 views
0

私のアプリケーション用のデータベースとしてレルムを使用しています。グローバルrealmChangeListenerでどのテーブルが変更されたかを知る

私のデータベースには、Table1、Table2、Table3、Table4、Table5というテーブルはほとんどありません。
テーブルの1つからのデータを表示するテーブルと同じ数のアクティビティがあります。

たとえば、
Activity1は
Activity2は、その対応するテーブルの変更の一部のデータとすぐに、それぞれの活動を更新する表3から表2から
Activity3を表示するであろうデータを、データを表示し、そう

であろう表1からのデータを表示するであろうrealmChangeListenerをrealmインスタンスに登録しました。私はレルムを中央クラスでインスタンス化します。私はRealmChangeListenerをすべての個々のクラスに登録したくはありません。一度それを登録すると、より一層メンテナンスが容易になります。

しかし、RealmChangeListenerのonChangeコールバックでは、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? 

      } 
     }); 
    } 
} 

私の目標は、のonChangeコールバックから変更テーブルに関する情報をLocalBroadcastManagerを経由して放送を送信することです。すべてのアクティビティがこのブロードキャストをリッスンし、リスニングアクティビティに関連付けられたテーブルのデータが変更された場合、それ自体が更新されます。活動の残りの部分は放送を無視するだけです。私の目的は、アプリケーション内の1か所からデータベース変更を監視し、データベース変更のために1つのブロードキャストのみを送信することです。データベースの変更を処理するビジネスロジックは、ブロードキャストに含まれる情報に依存します。

私の質問は、グローバルレルムに登録されているRealmChangeListenerでどのテーブルが変更されたかを通知することができますか?そうでない場合は、私がしたいことを達成するための選択肢がありますか?私が働いている

レルム - 1.0.1
アンドロイドスタジオ - 2.1.2
分SDK - 19
ターゲットSDK - 23

私はAndroid上で自分のアプリケーションをテストしています5.1.1

ご協力いただきありがとうございます。

答えて

0

あなたのアプリの関連するRealmResultsに変更リスナーを登録するだけではどうですか?レルムは、変更リスナーの登録が必要な場所に登録するように設計されています。このタイプの通知では、最も摩擦のないものにする必要があります。

LocalBroadcastManagerルートに移動することを決定した場合、グローバルレルムを使用して変更されたテーブルを検出することはできません。スキーマの各テーブルのすべてを選択したクエリに対して、変更リスナーを登録する必要があります。次のパターンを使用することができます:

// 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!私は、各アクティビティの領域結果に変更リスナーを登録しようとします。しかし、2番目のアプローチも興味深いようです。助けてくれてありがとう。 – rbing

関連する問題