【问题标题】:Android Realm Handling Primary Key in Relational ObjectAndroid Realm 处理关系对象中的主键
【发布时间】:2016-12-28 17:02:24
【问题描述】:

我有两个对象:MailBoxEmail。每个 Receiver 有多个Emails

public class MailBoxRealmModel extends RealmObject {

    @PrimaryKey
    private long id;

    private String name;
    private String mailboxId;
    private RealmList<EmailRealmModel> emails;
}

public class EmailRealmModel extends RealmObject {

    @PrimaryKey
    private long EmailId;

    private String Name;
    private String Text;
    private String Tag;
    private int Type;
    private String Time;
    private int Status;
}

如何在向 MailBoxRealmModel 添加电子邮件时使用**realm.insertOrUpdate**

EmailRealmModel email = new EmailRealmModel();
email.setMessageId(emailID);

realm.insertOrUpdate(email );

mailBoxRealmModel.getEmails().add(email);

我在这一行收到一个空指针异常email

mailBoxRealmModel.getEmails().add(email);

例外:

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean io.realm.RealmList.add(io.realm.RealmModel)” 在 com.koa.mailbox.MailBoxActivity$1.execute(MailBoxActivity.java:123) 在 io.realm.Realm.executeTransaction(Realm.java:1253) 在 com.koa.mailbox.MailBoxActivity.test(MailBoxActivity.java:88) 在 com.koa.mailbox.MailBoxActivity.onCreate(MailBoxActivity.java:71) 在 android.app.Activity.performCreate(Activity.java:6876) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350) 在 android.app.ActivityThread.access$1100(ActivityThread.java:222) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:158) 在 android.app.ActivityThread.main(ActivityThread.java:7229) 在 java.lang.reflect.Method.invoke(Native Method)

【问题讨论】:

  • 你能显示完整的异常信息吗?
  • 我确实添加了我的前任
  • 问题是你的mailBoxRealmModel 是一个非托管的RealmObject。您是如何获得mailBoxRealmModel 的?

标签: android sqlite android-sqlite realm realm-list


【解决方案1】:

使用现有主键创建新 RealmObject 的正确方法是使用 realm.createObject(EmailRealmModel.class, emailID)method。

完整代码片段:

realm.beginTransaction();
EmailRealmModel email = realm.createObject(EmailRealmModel.class, emailID);
mailBoxRealmModel.getEmails().add(email);
realm.commitTransaction();

或者,如果您希望使用内存实例之一更新存储在领域对象中,您应该调用realm.copyToRealmOrUpdate(obj)

来自documentation的示例:

// For create managed proxy, you should wrap EmailRealmModel object by call copyToRealmXXX
EmailRealmModel email = realm.copyToRealmOrUpdate(new EmailRealmModel(id));
mailBoxRealmModel.getEmails().add(email);

【讨论】:

  • 我知道,但是我有多个可能具有相同 ID 的电子邮件,所以我需要更新我的记录,所以我想使用 realm.insertOrUpdate
  • 好吧,但是当我创建 MyObject obj = new MyObject(); 时,obj 在此行 mailBoxRealmModel.getEmails() 上给了我空指针。添加(电子邮件);
  • Java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean io.realm.RealmList.add(io.realm.RealmModel)”
  • 据此answer “- 这是因为您试图将非托管对象添加到托管列表”。我正在为您的任务修复示例
  • 不需要内部事务。只需使用您的包装对象
【解决方案2】:

在非托管 RealmObject 上,RealmList 字段必须手动初始化。

EmailRealmModel email = new EmailRealmModel();
email.setMessageId(emailID);

mailBoxRealmModel.setEmails(new RealmList<MailBoxRealmModel>());
mailBoxRealmModel.getEmails().add(email);
realm.insertOrUpdate(mailBoxRealmModel);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多