android - 在 Android 中保存 Realm 对象时出错

标签 android realm

我正在使用 Realm 数据库开发应用程序。我已经成功开发了那个应用程序,今天我要添加另一个部分。在那期间,我不得不更改 Object extended 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();
}

这是我得到的错误:

FATAL EXCEPTION: main Process: com.foxastudios.stopnosocomials, PID: 26320 java.lang.NullPointerException: Attempt to invoke virtual method 'io.realm.BaseRealm io.realm.ProxyState.getRealm$realm()' on a null object reference at io.realm.ObserverRealmProxy.realmSet$uuid(ObserverRealmProxy.java:239) at com.foxastudios.stopnosocomials.models.Observer.setUuid(Observer.java:107) at com.foxastudios.stopnosocomials.models.Observer.(Observer.java:26) at io.realm.ObserverRealmProxy.(ObserverRealmProxy.java:0) at io.realm.DefaultRealmModuleMediator.newInstance(DefaultRealmModuleMediator.java:145) at io.realm.BaseRealm.get(BaseRealm.java:603) at io.realm.Realm.createObject(Realm.java:709) at io.realm.ObserverRealmProxy.copy(ObserverRealmProxy.java:626) at io.realm.ObserverRealmProxy.copyOrUpdate(ObserverRealmProxy.java:616) at io.realm.DefaultRealmModuleMediator.copyOrUpdate(DefaultRealmModuleMediator.java:175) at io.realm.Realm.copyOrUpdate(Realm.java:1272) at io.realm.Realm.copyToRealmOrUpdate(Realm.java:747) at com.foxastudios.stopnosocomials.SessionActivity$3.execute(SessionActivity.java:143) at io.realm.Realm.executeTransaction(Realm.java:1065) at com.foxastudios.stopnosocomials.SessionActivity.createObserver(SessionActivity.java:140) at com.foxastudios.stopnosocomials.SessionActivity.access$300(SessionActivity.java:29) at com.foxastudios.stopnosocomials.SessionActivity$2.onClick(SessionActivity.java:101) at android.view.View.performClick(View.java:4756) at android.view.View$PerformClick.run(View.java:19749) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

我已经多次检查 Observer 对象中的任何空值。但是所有的值都是正确的并且没有异常(exception),直到:

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

最佳答案

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

If declared, the default constructor (constructor with no parameters) must always be empty. The reason is that a default contructor will call methods which assume a Realm instance is present.

来源: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);
}

proxyState 在构造函数执行时为null

关于android - 在 Android 中保存 Realm 对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161824/

相关文章:

ios - 当iOS由于缺少最近的使用而自动卸载应用程序时,本地Realm DB会发生什么情况?

ios - 在两个不同的应用程序之间共享数据库/文件

Android Wear 表盘保持屏幕常亮

android - procrank 和 dumpsys meminfo 有什么区别?

ios - 在 Realm 数据库中保存数组值

java - 检查 android Realm 中的唯一值

swift - iOS 应用程序在使用 Realm 和 Crashlytics 通过 testflight 启动时卡住

android - 适用于 Android 的良好预建 GNU 工具链?

android - ParseObject.save() 抛出 IllegalArgumentException(无法保存未通过身份验证的用户)为什么?

java - 如何从 Java Android 中的按钮单击调用 Location 方法?