gpt4 book ai didi

java - 由于空对象引用,无法将新对象添加到 RealmList

转载 作者:太空宇宙 更新时间:2023-11-03 11:48:53 24 4
gpt4 key购买 nike

我必须定义对象,一个是具有两个字符串和一个 boolean 值的基本 RealmObject,另一个只是该对象的 RealmList,以便于访问。当我尝试从我的 ContactBook 实例获取列表并添加一个新对象时,我尝试在空对象引用上调用虚拟方法。但是,我能够获取 contactBook 的大小以及联系人的数量,因此它们不为空。

我尝试添加新对象的类

public void viewSetup() {
setContentView(R.layout.activity_contacts);
ButterKnife.inject(this);
Realm.deleteRealmFile(this);
realm = Realm.getInstance(this);
results = realm.where(ContactBook.class).findAll();
if (toolbar != null) {
setSupportActionBar(toolbar);
}

if (results.size() == 0) {
realm.beginTransaction();
ContactBook contactBook = realm.copyToRealm(new ContactBook());
realm.commitTransaction();
}
}

public void setupCursor() {
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
ContactBook contactBook = results.first();

realm.beginTransaction();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if (contactBook.getContacts().where().equalTo("name", name).findAll().size() == 0 && contactBook.getContacts().where().equalTo("number", number).findAll().size() == 0) {
contactBook.getContacts().add(new Contact(name, number, false));
}
}
realm.commitTransaction();



cursor.close();
}

类有两个字符串和 boolean 值

public class Contact extends RealmObject {

private String name;
private String number;
private boolean allowed;

public Contact() {

}

public Contact(String name, String number, boolean allowed) {
this.name = name;
this.number = number;
this.allowed = allowed;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public boolean isAllowed() {
return allowed;
}

public void setAllowed(boolean allowed) {
this.allowed = allowed;
}
}

通讯录类

public class ContactBook extends RealmObject {

private RealmList<Contact> contacts = new RealmList<>();

public ContactBook() {

}

public RealmList<Contact> getContacts() {
return contacts;
}

public void setContacts(RealmList<Contact> contactBook) {
this.contacts = contactBook;
}
}

错误日志

    java.lang.RuntimeException: Unable to start activity ComponentInfo{io.github.brady131313.textback/io.github.brady131313.textback.View.ActivityContactSelect}: java.lang.NullPointerException: Attempt to invoke virtual method 'long io.realm.internal.Row.getIndex()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2661)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.access$900(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
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:1388)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long io.realm.internal.Row.getIndex()' on a null object reference
at io.realm.RealmList.add(RealmList.java:122)
at io.github.brady131313.textback.View.ActivityContactSelect.setupCursor(ActivityContactSelect.java:69)
at io.github.brady131313.textback.View.ActivityContactSelect.onCreate(ActivityContactSelect.java:39)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
            at android.app.ActivityThread.access$900(ActivityThread.java:172)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5835)
            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:1388)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)

最佳答案

这是因为您正试图将非托管对象添加到托管列表中。这里的代码:

if (contactBook.getContacts().where().equalTo("name", name).findAll().size() == 0 && contactBook.getContacts().where().equalTo("number", number).findAll().size() == 0) {
contactBook.getContacts().add(new Contact(name, number, false));
}

应该是:

if (contactBook.getContacts().where().equalTo("name", name).findAll().size() == 0 && contactBook.getContacts().where().equalTo("number", number).findAll().size() == 0) {
Contact newContact = realm.copyToRealm(new Contact(name, number, false));
contactBook.getContacts().add(newContact);
}

如果不使用 Realm.copyToRealmXXX 方法之一,则无法将使用 new 运算符创建的对象添加到已经存在于 Realm 中的 RealmLists 中,因为它必须被转换首先到适当的(或托管的) Realm 对象。但错误消息肯定会更好。

关于java - 由于空对象引用,无法将新对象添加到 RealmList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com