在Android中保存Realm对象时出错



我正在使用Realm数据库开发应用程序。我已经成功地开发了那个应用程序,今天我又添加了另一部分。在此期间,我不得不更改Object扩展的RealmObject。在那之后,我出现了错误,我撤销了更改。但在那之后,同样的错误也一次又一次地发生。这是我的代码:

private String createObserver() {
final Observer observer = new Observer();
Log.d("UUID",observer.getUuid());
observer.setObserver_id(getNewObserverID());
observer.setDevice_id(DEVICE_ID);
observer.setName(userName.getText().toString());
observer.setPhone(userPhone.getText().toString());
observer.setCategory(userCategory.getSelectedItem().toString());
observer.setHospital(userHospital.getSelectedItem().toString());
observer.setSection(userSection.getSelectedItem().toString());
observer.setUpdated_date(DATE);
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(observer);
}
});
return observer.getUuid();
}

这是我得到的错误:

致命异常:main流程:com.foxastudios.stopnosocomials,PID:26320java.lang.NullPointerException:尝试调用虚拟方法null上的"io.realm.BaseRealm io.realm.ProxyState.getRealm$realm()"对象引用在io.remarm.ObserverRealmProxy.realmSet$uuid(ObserverRealmProxy.java:239)在com.foxastudios.stopnosocomials.models.Observer.setUuid(Observer.java:107)在com.foxastudios.stopnosocomials.models.Observer。(Observer。java:26)位于io.remarm.ObserverRealmProxy.(ObserverRealmProxy.java:0)在io.remarm.DefaultRealmModuleMediator.newInstance(DefaultRealmModuleMediator.java:145)位于io.rerealm.BaseRealm.get(BaseRealm.java:603)位于io.remarm.realm.createObject(realm.java:709)位于io.remarm.ObserverRealmProxy.copy(ObserverRealmProxy.java:626)在io.remarm.ObserverRealmProxy.copyOrUpdate(ObserverRealmProxy.java:616)在io.remarm.DefaultRealmModuleMediator.copyOrUpdate(DefaultRealmModuleMediator.java:175)位于io.remarm.realm.copyOrUpdate(realm.java:1272)位于io.remarm.realm.copyToRealmOrUpdate(realm.java:747)在com.foxastudios.stopnosocomials.SessionActivity$3.execute(SessionActivity.java:143)在io.rerealm.realm.executeTransaction(realm.java:1065)在com.foxastudios.stopnosocomials.SessionActivity.createObserver(SessionActivity.java:140)在com.foxastudios.stopnosocomials.SessionActivity.access$300(SessionActivity.java:29)在com.foxastudios.stopnosocomials.SessionActivity$2.onClick(SessionActivity.java:101)在android.view.view.performClick(view.java:4756)在android.view.view$PerformClick.run(view.java:19749)在android.os.Handler.handleCallback(Handler.java:739)在android.os.Handler.dispatchMessage(Handler.java:95)在android.os.Looper.loop(Looper.java:135)在android.app.ActivityThread.main(ActivityThreads.java:5221)位于java.lang.reflect.Method.ioke(本机方法)位于java.lang.reflect.Method.ioke(Method.java:372)在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:694)

我已经多次检查Observer对象中的任何空值。但所有的值都是正确的,无一例外,直到:

realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.copyToRealmOrUpdate(observer);
}
});

Realm对象的默认构造函数必须为空:

如果声明,默认构造函数(不带参数的构造函数)必须始终为空。原因是默认构造函数将调用假设存在Realm实例的方法。

来源:https://realm.io/docs/java/latest/#limitations

不允许在构造函数中调用setUuid()

Observer.setUuid()将调用ObserverRealmProxy.realmGet$uuid(),看起来像这样:

public int realmGet$uuid() {
proxyState.getRealm$realm().checkIfValid();
return (int) proxyState.getRow$realm().getLong(columnInfo.uuidIndex);
}

proxyStatenull,而构造函数执行

最新更新