即使托管对象没有任何更改,也会触发RealmObjectChangeListener

时间:2017-09-08 08:02:20

标签: java android realm

我在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();
    }

1 个答案:

答案 0 :(得分:0)

insertOrUpdate()将提供的对象中的所有字段复制到关联的新/现有RealmObject中,因此它有资格修改每个字段。

如果您不想修改每个字段,那么您应该检查是否相等并仅在字段值不同时设置字段值。

https://github.com/realm/realm-core/issues/2787中对此进行了讨论,但如果发生这种情况,它会发生一段时间。