我使用Realm作为我的应用程序的数据库。
我的数据库中有几张表 - 表1,表2,表3,表4和表5。
我有与表相同数量的活动,每个活动都显示其中一个表的数据。
例如。
Activity1将显示Table1中的数据
Activity2将显示Table2中的数据
Activity3将显示Table3中的数据,依此类推
要在相应表中的某些数据发生更改时立即更新相应的活动,我已经在我的realm实例中注册了一个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?
}
});
}
}
我的目标是通过LocalBroadcastManager发送广播,其中包含有关从onChange回调中更改了哪个表的信息。所有活动都将监听此广播,如果与监听活动相关联的表中的数据发生更改,则它将自行更新。其余的活动只会忽略广播。我的目标是仅在我的应用程序中的一个位置监视数据库更改,并仅发送一个广播以进行数据库更改。处理数据库更改的业务逻辑将取决于广播中包含的信息。
我的问题是,是否有可能收到有关在全局域中注册的RealmChangeListener中修改了哪些表的通知?如果没有,那么有没有其他选择来实现我想做的事情?
我正在使用:
境界 - 1.0.1
Android Studio - 2.1.2
Min SDK - 19
目标SDK - 23
我在Android 5.1.1上测试我的应用程序
提前感谢所有帮助。
答案 0 :(得分: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();
}