我在Application类中获取实例,并在我的baseActivity类中将其作为全局实例进行管理。
我有一个保存按钮,可以从edittexts获取字符串,将字符串设置为对象,insertOrUpdate()
设置为领域数据库。
即使对象没有任何变化,触发侦听器并且在所有字段都被修改时返回changeSet对象。
可能我错过了关于Realm基础知识的观点。
My Realm版本是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();
}
}
我的BaseActivity类;
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类中的覆盖方法,
使用具有相同id(id = 0)的新Ayarlar对象在我的MVP视图类中设置包含字符串的字段,当我设置除了&#39; 0&#39;侦听器未按预期触发;
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演示者类中提交数据的方法;
@Override
public void saveAyarlar(Ayarlar ayarlar) {
baseRealm.beginTransaction();
baseRealm.insertOrUpdate(ayarlar);
baseRealm.commitTransaction();
}
答案 0 :(得分:0)
insertOrUpdate()
将提供的对象中的所有字段复制到关联的新/现有RealmObject中,因此它有资格修改每个字段。
如果您不想修改每个字段,那么您应该检查是否相等并仅在字段值不同时设置字段值。
在https://github.com/realm/realm-core/issues/2787中对此进行了讨论,但如果发生这种情况,它会发生一段时间。