2015-02-28 2 views
3

У меня есть некоторые функции, которые сохраняют данные «Диалог» и «Сообщение» в области БД.Исключение Null Pointer в Realm

private void addMessageToDialog(ObservableDialog dialog, DialogMessage dialog_msg) { 
     // if i try to use FINDDIALOG - i have NPE errors 
     rDialog rDialog = findDialog(dialog.getChatId()); 
     realm.beginTransaction(); 
     rMessage rMessage = constructObjectRMessage(dialog_msg); 
     realm.copyToRealm(rMessage);    
     if(rDialog==null) rDialog = constructObjectRDialog(dialog); 
     rDialog.getDialogMessages().add(rMessage); 
     realm.copyToRealmOrUpdate(rDialog); 
     realm.commitTransaction(); 
    } 
private rDialog constructObjectRDialog(ObservableDialog dialog) { 
     try { 
      rDialog rDialog = new rDialog(); 
      rDialog.setChatId(dialog.getChatId()); 
      rDialog.setCreator(dialog.isCreator()); 
      rDialog.setNickname(dialog.getNickname()); 
      rDialog.setAvatarUrl(dialog.getAvatarUrl()); 
      rDialog.setPartnerOkId(dialog.getPartnerId()); 
      rDialog.setBanned(dialog.isBanned()); 

      List<ChatStatus> statusHistory = dialog.getStatusHistory(); 
      RealmList<rChatStatus> statuses = new RealmList<>(); 
      for (ChatStatus s : statusHistory) { 
       rChatStatus st = constuctorRChatCtatus(s.name()); 
       realm.copyToRealm(st); 
       statuses.add(st); 
      } 
      rDialog.setStatusHistory(statuses); 

      List<DialogMessage> dialogMessages = dialog.getMessages(); 
      RealmList<rMessage> messages = new RealmList<>(); 
      for (DialogMessage d : dialogMessages) { 
       rMessage m = constructObjectRMessage(d); 
       realm.copyToRealm(m); 
       messages.add(m); 
      } 
      rDialog.setDialogMessages(messages); 
      return rDialog; 
     } catch(Exception e){ 
      Log.e(TAG,e.getMessage()); 
     } 
     return null; 
    } 


private rDialog findDialog(String chatId) { 
     RealmResults<rDialog> d = realm.where(rDialog.class) 
      .equalTo("chatId", chatId) 
      .findAll();    
     if(d.size()==0) return null; 
     return d.first(); 
    } 

Когда я использую этот код, он работает только тогда, когда я не использую findDialogrealm.where метод, и использовать только constructObjectRDialog). Но когда я пытаюсь использовать findDialogaddMessageToDialog) У меня есть ошибка NPE в

rDialog.getDialogMessages().add(rMessage); 

Почему может быть такая erros? PS - rMessage и rDialog не нулевые (когда я проверить его в отладчике)

LOG:

02-28 11:43:21.220 6432-6460/com.OkLove.OkLoveDroid E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-468 
    Process: com.OkLove.OkLoveDroid, PID: 6432 
    java.lang.NullPointerException 
      at io.realm.RealmList.add(RealmList.java:120) 
      at com.OkLove.OkLoveDroid.BackgroundTasksHandlers.DbHandler.addMessageToDialog(DbHandler.java:98) 
      at com.OkLove.OkLoveDroid.BackgroundTasksHandlers.DbHandler.handleMessage(DbHandler.java:77) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at com.OkLove.OkLoveDroid.BackgroundTasksHandlers.DbHandlerThread.run(DbHandlerThread.java:30) 
+0

Опубликовать свой журнал с logacat –

+0

@ChristianMelchior, вы можете помочь мне с этой проблемой? –

ответ

2

кажется, что проблема была в «копиях объекта, которые имеют тип Realm» и «реальная экземпляр область дб объекта», см https://groups.google.com/forum/#!topic/realm-java/lK6Q6zRYTE0

Мой отредактированный код теперь выглядит следующим образом:

private void addMessageToDialog(ObservableDialog dialog, DialogMessage dialog_msg) { 
     rDialog rDialog = findDialog(dialog.getChatId()); 
     rMessage rMessage = constructObjectRMessage(dialog_msg); 
     realm.beginTransaction(); 
     rMessage = realm.copyToRealm(rMessage); 
     if(rDialog==null) { 
      rDialog = constructObjectRDialog(dialog); 
      if(rDialog!=null) rDialog = realm.copyToRealm(rDialog); 
      else realm.cancelTransaction(); 
     } else Log.v(TAG,"dialog is not null"); 
     rDialog.getDialogMessages().add(rMessage); 
     realm.commitTransaction(); 
    } 

При выполнении copyToRealm - должен использовать тип возврата rDialog для редактирования объекта realm (но не для копии отдельного объекта)

Смежные вопросы