有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

即使托管对象没有任何更改,也会触发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) 个答案

  1. # 1 楼答案

    insertOrUpdate()将所有字段从提供的对象复制到关联的新/现有RealmObject中,因此它符合修改每个字段的条件

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

    https://github.com/realm/realm-core/issues/2787中对此进行了讨论,但如果确实发生了,还需要一段时间