2016-06-21 87 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