2015-05-20 3 views
3

У меня к объектам realm, один из основных объектов RealmObject с двумя строками и булевым, другой - просто RealmList для этого объекта для облегчения доступа. Когда я пытаюсь получить список из моего экземпляра ContactBook и добавить новый объект, я получаю попытку вызвать виртуальный метод с ссылкой на нулевой объект. Однако я могу получить размер контактной книги и количество контактов, чтобы они не были нулевыми.Невозможно добавить новый объект в RealmList из-за нулевой ссылки на объект

Класс Где я пытаюсь добавить новые объекты

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

Error Log

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) 
+0

Ошибка произошла внутри 'setContacts', вызванной из' setupCursor'. Но ваш метод 'setupCursor' не вызывает' setContents'. Это ваш настоящий код и ваш реальный журнал? (Я ничего не знаю о Realms) – immibis

+0

Журнал обновлен. – Brady131313

+0

Вы уверены, что ни 'имя', ни' номер' не являются «нулевыми», когда вы пытаетесь вставить их в свое царство? – Emanuelez

ответ

10

Это потому, что вы пытаетесь добавить не управляемого объекта в управляемый список. Этот код здесь:

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

объекты, созданные с помощью не могут быть добавлены к RealmLists, которые уже в Realm без использования одного из Realm.copyToRealmXXX методов в new оператора, так как он должен сначала преобразуется в правильный (или управляемый) объект Realm. Но сообщение об ошибке, безусловно, может быть лучше.

+2

все это с управляемыми/неуправляемыми объектами - одна из главных причин замешательства. –

+0

Не так уж и много. Вам просто нужно _insert_ свои объекты перед их использованием: P – josemigallas