【问题标题】:Change notifications in Realm for inner objects?更改领域中内部对象的通知?
【发布时间】:2017-11-22 14:48:40
【问题描述】:

当我有一个包含B 领域列表的对象A 时,如果我查询特定A 并编辑其B 列表中的项目;我不会收到更改通知

这是期望的行为吗?

代码示例:

class ExerciseInfo : RealmObject() {
    @PrimaryKey 
    var id: String? = null
    var muscleFields: MuscleFields? = null
}

class MuscleFields : RealmObject() {
    var muscles: RealmList<Muscle>? = null
}

class Muscle : RealmObject() {
    var id: String? = null
    var name: String? = null
}

//Example, performed inside a Realm transaction
realm.where(ExerciseInfo::class.java)
    .findFirst()
    .muscleFields
    ?.muscles
    ?.let{ it.first().name += ":)" }

以上所有内容都是示例代码 - 但场景完全相同。

我可以验证编辑是否已执行并存储在数据库中;并且不会为 ExeciseInfo RealmObject 触发更改通知,无论我是否将其与 addChangeListener() 或 Flowable 方法一起使用。此外,如果直接在练习课上执行编辑,则相同的场景确实有效,例如直接在 ExerciseInfo 类上编辑一些字段,而不是在其中编辑其他对象。

我希望这是有道理的。认为 Id 在 Realm Github 之前将其发布在 SO 上,因为它可能是我错过的东西,而不是错误。

有什么想法吗? - 让我知道。谢谢!

【问题讨论】:

  • RealmChangeListener 添加到了什么?
  • @EpicPandaForce ExerciseInfo 对象。
  • exerciseInfo.addChangeListener(new RealmObjectChangeListener 或类似的东西?不是realmResults
  • @EpicPandaForce 在这种情况下,我只是查询一个对象(findFirst()),所以监听器被直接添加到它。
  • 这应该是期望的行为。见realm.io/docs/java/4.2.0/api/io/realm/…在List中添加/删除/移动元素,但不修改列表中的对象时应该触发。

标签: android kotlin realm


【解决方案1】:

RealmChangeListener 直接添加到对象将通知列表(链接字段)的更改。

为此,您需要将侦听器添加到RealmResults&lt;T&gt;

【讨论】:

  • 如果我查询列表,我希望在任何项目被修改(更新或删除)以及是否添加任何新项目时得到通知。对于单个项目,我只想知道它是否被更新或删除。这在大多数情况下都有效,但如果我更新项目内部字段(如上面的示例),则不会。
  • 单一对象通知不通知链接对象。为此,您需要单个对象的RealmResults&lt;T&gt;(除非您正在监听特定的字段更改,否则我倾向于建议这样做),这可以通过equalTo("id", id) 条件来完成。这样,它也可以抵御项目删除。
【解决方案2】:

在您的活动中尝试以下代码

class SampleActivity extends AppCompatActivity implements  RealmChangeListener<Realm> {


onCreate(...){

realm.addChangeListener(this);// make sure you init realm transaction

}

     @Override
    public void onChange(@NonNull Realm realm) {
    // this method will be call after any change in realm
    }
}

不要忘记在onDestroy 方法中移除所有注册的监听器。


realm = Realm.getDefaultInstance();

realm.addChangeListener(new RealmChangeListener<Realm>() {
            @Override
            public void onChange(Realm realm) {
                // do something 
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多