当我尝试在Android中删除时,Realm获取NullPointerException

时间:2015-02-19 05:36:30

标签: android realm

我有一个Android应用程序,在地图中显示路线,我从我自己的网络服务接收数据,如下所示:

“可用”字段指示此路由是否仍处于活动状态(true)或否(false)。我的代码如下:

如果路线处于活动状态,则必须创建或升级(如果存在)

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

工作完美。

否则“可用”== 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

1 个答案:

答案 0 :(得分:2)

请参阅Realm文档中的此部分:Using a Realm across Threads

  

跨线程使用Realm的唯一规则是记住Realm,RealmObject或RealmResults实例不能跨线程传递。当您想要从不同的线程访问相同的数据时,您应该只需获取一个新的Realm实例(即Realm.getInstance(上下文上下文)或其表兄弟)并通过查询获取您的对象。这些对象将映射到磁盘上的相同数据,并且可读和可写任何线程!

Here's an example如何跨多个线程访问Realm数据。

希望这有帮助。