【问题标题】:Realm gets NullPointerException when I try to delete in Android当我尝试在 Android 中删除时,领域得到 NullPointerException
【发布时间】:2015-02-19 05:36:30
【问题描述】:

我有一个在地图中显示路线的 Android 应用,我从自己的 Web 服务以 JSON 格式接收数据,如下所示:

“可用”字段指示此路由是否仍处于活动状态 (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

【问题讨论】:

  • 这个标题是什么意思?
  • 好的,我改了标题

标签: android realm


【解决方案1】:

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

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多