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