【问题标题】:SQL delete where NOT IN doesn't workSQL delete where NOT IN 不起作用
【发布时间】:2018-01-06 17:45:17
【问题描述】:

我正在使用 Android 组件中的 room dao。 我需要的是:插入列表,但之前 - 从 db 中删除 id 与新列表中的 id 不同的所有数据。

这是我的简单数据类:

class Data{
   String id; //unique for each data class

   //some other data parameters here
}

我的任务的最佳选择是使用DELETE WHERE NOT IN someArray。这是我的代码中的示例:

@Query("DELETE " +
        "FROM MY_TABLE " +
        "WHERE data_id NOT IN ( :listOfId )")
abstract protected fun deleteUniqueData(listOfId:String):Int

所以当我收到必须保存的新列表时,我创建下一个带有 ids 的字符串:"'0','1'" 并调用方法deleteUniqueData

但是每次我调用这个,我都会收到2作为结果,这意味着有2行被删除了。

有趣的部分:当我替换

"WHERE data_id NOT IN ( :listOfId )")

"WHERE data_id NOT IN ('0','1')") //same data but hardcoded

我收到0 作为结果。所以看起来 Room 有问题。

任何想法为什么 NOT IN 不起作用?或者如何解决?

更新

这里是生成的查询:

"DELETE FROM MY_TABLE WHERE data_id NOT IN ( ? )"

【问题讨论】:

  • 查看生成的代码,看看哪里出错了。
  • 我在努力!但是我来到本机方法并且无法调试它。在本地方法调用之前一切看起来都很好
  • “但是我使用的是本地方法,无法调试它”——Room 不使用 NDK,所以我不确定你指的是什么。我应该更清楚:在 build/generated/source/ 中查看 Room 生成的代码,看看它为您的 NOT IN 场景提供了什么。
  • 你是对的。 nativeExecuteForChangedRowCount 是 SQLiteConnection 的方法。
  • @CommonsWare 生成的查询看起来不错。

标签: android sql sqlite android-room android-components


【解决方案1】:

更改deleteUniqueData() 以将ID 列表或数组作为参数。不要自己组装逗号分隔的列表。房间就是这样做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多