如何使用SQLite“ IN”运算符更新多行?

时间:2019-08-24 16:03:42

标签: java android android-room

在我的android应用程序中,我保存了一些必须发送到服务器的事件。发送的所有事件,我都必须标记为“已发送”。 在我发送了所有未标记的事件(已发送= 0)后,服务器将以其保存的所有ID组成的数组进行回复。然后,在android应用程序中,我使用所有ID执行更新查询,但这不起作用。

EventDao.java

@Dao
public interface EventDao {
    @Query("UPDATE Event SET sent = 1 WHERE id IN (:ids)")
    void updateSent(String ids)
}

MarkEvent.java

...
    DatabaseClient.getInstance(context).getDb().eventDao().updateSent(response.join(","));
    Log.d("MarkEvent", response.join(","));
...

“响应”是一个只有整数的JSONArray。 当服务器回复时,我可以在Logcat中阅读此内容:

D/MarkEvent: 2,3,4,5,6,7,8

此数字是正确的记录ID

2 个答案:

答案 0 :(得分:1)

您必须用List替换String(ids)。 因此,您的方法将如下所示:

ccl

有人已经遇到类似的问题: https://stackoverflow.com/a/53632880/5612090

答案 1 :(得分:0)

我更好地阅读了“ @Query”符号文档:Room Query Annotation 从文档中:

  

Room支持将参数列表绑定到查询。在运行时,Room将构建正确的查询以具有匹配数量的绑定参数,这取决于方法参数中的项目数。

所以我这样改变了我的道

@Dao
public interface EventDao {
    @Query("UPDATE Event SET sent = 1 WHERE id IN (:ids)")
    void updateSent(int[] ids)
}

在我的类MarkEvent.java中,我添加了一个静态函数(来自How to cast a JSONArray to int Array),并且修改了该调用:

public static int[] JSonArray2IntArray(JSONArray jsonArray){
    int[] intArray = new int[jsonArray.length()];
    for (int i = 0; i < intArray.length; ++i) {
        intArray[i] = jsonArray.optInt(i);
    }
    return intArray;
}

...

DatabaseClient.getInstance(context).getDb().eventDao().updateSent(JSonArray2IntArray(response));

...

现在工作!谢谢。