2015-02-19 2 views
-1

У меня есть Android приложение, которое показывает маршруты в карте, я получаю данные из моих собственных веб-сервисов в формате JSON как это:Realm получает NullPointerException при попытке удалить в Android

«Доступные» поля указывает если эти маршруты все еще активны (true) или нет (false). Мой код выглядит следующим образом:

Если маршрут активен, необходимо создать или uptade (если только существует)

if(json.getBoolean("available") == true) 
{ 
    synchronized(realm){ 
     realm.beginTransaction(); 
     Ruta ruta = realm.where(Ruta.class).equalTo("id", json.getLong("id")).findFirst(); 

     //If doesn't exists we create a new route else I clear the coordinates to add news 
     if(ruta == null){ 
      ruta = realm.createObject(Ruta.class); // Create a new object 
     }else{ 
      ruta.getCoordenadas().clear(); 
     } 

     ruta.setNombre(json.getString("name")); 
     ruta.setType_id(json.getInt("type_id")); 

     final JSONArray jsonCoordenadas = json.getJSONArray("coordinates"); 
     for(int i = 0; i < jsonCoordenadas.length(); i++){ 

      final JSONObject jsonCoordenada = jsonCoordenadas.getJSONObject(i); 
      Coordenada coordenadas = realm.createObject(Coordenada.class); 
      coordenadas.setLat(jsonCoordenada.getDouble("lat")); 
      coordenadas.setLon(jsonCoordenada.getDouble("lon")); 
      ruta.getCoordenadas().add(coordenadas); 
     } 
     realm.commitTransaction(); 
    } 
} 

И работает отлично.

Else "available" == false, пришло время удалить.

else 
{ 
    synchronized(realm){ 
     final Ruta ruta = realm.where(Ruta.class) 
       .equalTo("id", json.getLong("id")) 
       .findFirst(); 
     if(ruta != null) 
     { 
      realm.beginTransaction(); 
      if(ruta.getCoordenadas().size() > 0) 
       ruta.getCoordenadas().clear(); 
      ruta.removeFromRealm(); 
      realm.commitTransaction(); 
     } 
    } 
} 

//If I create, update or delete I Save the last update Date of routes 
synchronized(realm){ 
    realm.beginTransaction(); 
    change.setCod(changeBdd); 
    Log.e("changeBdd",changeBdd); 
    realm.commitTransaction(); 
} 

И это не сработает, если я делаю это в первый раз, REALM «удалить» маршрут, но если я получил тот же JSon второй раз сейчас после удаления. REALM снова найдет маршрут, но при попытке уничтожить раздавить приложение.

java.lang.RuntimeException: An error occured while executing doInBackground() 
at android.os.AsyncTask$3.done(AsyncTask.java:300) 
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:841) 
Caused by: java.lang.NullPointerException 
at com.app.mapApp.ActivityPrincipal$CargaRutas.doInBackground(ActivityPrincipal.java:555) 
at com.app.mapApp.ActivityPrincipal$CargaRutas.doInBackground(ActivityPrincipal.java:1) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
... 4 more 

Плюс все это внутри AsyncTask конкретно в методе doInBackground

private class CargaRutas extends AsyncTask<ItemRuta, ItemRuta, Boolean>{ 

    @Override 
    protected Boolean doInBackground(ItemRuta... items) { 
    . 
    . 
    . 
    } 
} 

Я не знаю, как я могу исправить это, любой один помочь мне ??? Я использую Realm 0.76.0

+0

Что означает это название? –

+0

Хорошо, я изменил название –

ответ

2

Смотрите этот раздел в области Docs: Using a Realm across Threads

Единственное правило использования Realm между потоками, чтобы помнить, что Realm, RealmObject или RealmResults экземпляры не могут быть переданы через потоки. Если вы хотите получить доступ к тем же данным из другого потока, вы должны просто получить новый экземпляр Realm (т. Е. Realm.getInstance (контекст контекста) или его кузены) и получить ваши объекты через запрос. Объекты будут сопоставляться с одними и теми же данными на диске и будут считаны & могут быть записаны из любой темы!

Here's an example Как получить доступ к данным Realm через несколько потоков.

Надеюсь, это поможет.