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

Java 由于对象引用为空,无法将新对象添加到RealmList,java,android,realm,Java,Android,Realm,我必须对对象进行领域划分,一个是基本的RealmObject,带有两个字符串和一个布尔值,另一个只是该对象的RealmList,以便更容易访问。当我尝试从ContactBook实例中获取列表并添加新对象时,我会尝试在空对象引用上调用virtual方法。然而,我能得到的大小的通讯录,以及接触的数量,使这些都不是空的 类,尝试在其中添加新对象 public void viewSetup() { setContentView(R.layout.activity_contacts); B

我必须对对象进行领域划分,一个是基本的RealmObject,带有两个字符串和一个布尔值,另一个只是该对象的RealmList,以便更容易访问。当我尝试从ContactBook实例中获取列表并添加新对象时,我会尝试在空对象引用上调用virtual方法。然而,我能得到的大小的通讯录,以及接触的数量,使这些都不是空的

类,尝试在其中添加新对象

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();
}
使用两个字符串和布尔值初始化

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;
}
}

这是因为您试图将非托管对象添加到托管列表中。此代码如下:

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
运算符创建的对象添加到域中已存在的RealmLists中,因为必须首先将其转换为适当(或托管)的域对象。但是错误消息肯定会更好。

错误发生在从
setupCursor
调用的
setContacts
中。但是您的
setupCursor
方法不调用
setContents
。这是你真正的代码和日志吗?(我对领域一无所知)你确定当你尝试在你的领域中插入它们时,
name
number
都不是
null
吗?是的,如果我将它们添加到arraylist中,整个设置工作正常,从那里我可以记录所有联系人。即使我手动添加一个对象,我仍然会得到相同的错误。托管/非托管对象的整个问题只是造成混乱的一个主要原因。我认为这一点都不太好。您只需要在使用实体之前插入它们:P
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);
}