即使托管对象没有任何更改,也会触发java RealmObjectChangeListener
我在应用程序类中获取实例,并在baseActivity类中将其作为全局实例进行管理
我有一个保存按钮,它从EditText中获取字符串,将字符串设置为对象,并将insertOrUpdate()
设置为领域数据库
即使对象上没有任何更改,监听器也会被触发,并且在修改所有字段时changeSet对象会返回
也许我遗漏了一点关于领域的基础知识
我的领域版本是3.7.0
谢谢你的帮助
我的目标
public class Ayarlar extends RealmObject {
@PrimaryKey private Integer Id;
private String IcIp;
private String DisIp;
private String IcPort;
private String DisPort;
private String Sayfa;
// Getters and Setters
}
我的申请课
public class BaseApplication extends Application {
public static Realm baseRealm;
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
baseRealm = Realm.getDefaultInstance();
}
}
我的基本活动课
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (baseRealm.isClosed())
{
Realm.init(this);
baseRealm = Realm.getDefaultInstance();
}
}
@Override
protected void onResume() {
super.onResume();
if (baseRealm.isClosed())
{
Realm.init(this);
baseRealm = Realm.getDefaultInstance();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
baseRealm.close();
}
}
从数据库创建的对象,并在子活动中添加侦听器
Ayarlar ayarlar = baseRealm.where(Ayarlar.class).equalTo("Id",0).findFirst();
RealmObjectChangeListener<Ayarlar> listener = new RealmObjectChangeListener<Ayarlar>() {
@Override
public void onChange(Ayarlar ayarlar, @javax.annotation.Nullable ObjectChangeSet changeSet) {
Log.d("chhh", "onChange: "+changeSet.getChangedFields()[0]);
}
};
ayarlar.addChangeListener(listener);
下面两块是关于我的MVP类中的重写方法
在我的MVP视图类中设置带有字符串的字段,并使用具有相同id(id=0)的新Ayarlar对象,但在我设置除“0”监听器之外的id时,也未按预期触发
btn_kaydet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPresenter.saveAyarlar(new Ayarlar(
0,
txt_icIp.getText().toString(),
txt_disIp.getText().toString(),
txt_icPort.getText().toString(),
txt_disPort.getText().toString(),
txt_Sayfa.getText().toString()));
}
});
最后,这是我在MVP presenter类中提交数据的方法
@Override
public void saveAyarlar(Ayarlar ayarlar) {
baseRealm.beginTransaction();
baseRealm.insertOrUpdate(ayarlar);
baseRealm.commitTransaction();
}
# 1 楼答案
insertOrUpdate()
将所有字段从提供的对象复制到关联的新/现有RealmObject中,因此它符合修改每个字段的条件如果不想修改每个字段,则应检查是否相等,并仅在字段值不同时设置字段值
在https://github.com/realm/realm-core/issues/2787中对此进行了讨论,但如果确实发生了,还需要一段时间