【问题标题】:How to update a set of rows based on their (different) primary keys in SQLite (Android)?如何根据 SQLite(Android)中的(不同)主键更新一组行?
【发布时间】:2014-12-24 01:54:32
【问题描述】:

我有一个由几列组成的数据库表,包括id(主键)和last_sync(时间戳)。后台进程偶尔会与服务器同步表中的行。

如果进程成功,则返回...

  • 一个时间戳,表示同步时间
  • ids 的列表。这意味着属于这些 id 的行已成功同步

我现在要做的是用新的时间戳更新列表中id 的每一行的last_sync 列。


例子:

  • 返回时间戳:143394245
  • 返回列表:[11,25,64,126]

更新后,第 11、25、64 和 126 行的 last_sync 列应等于 143394245。


我怎样才能以最有效的方式做到这一点?该列表可能包含数千个 ID。

最简单(但最昂贵)的方法是遍历列表并为每个 id (update ... set last_sync = ... where id = ...) 执行更新语句,如果列表有 1000 个条目,这将导致 1000 次更新。这当然不是我想做的,尤其是在移动设备上。

另一个想法是做类似update ... set last_sync = ... where id IN (...) 的事情。 IN 旁边的集合将包含所有 ID。但是如何使用 StringBuilder 动态创建该集合?我认为这很 hacky..

我希望还有其他方法。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • 使用字符串生成器。由于 SQL 始终是一个字符串,因此在某些时候您必须有一个字符串生成器。 SQL 的 ASCII 特性非常强。

标签: android sql database sqlite android-sqlite


【解决方案1】:

您可以使用插入或替换:

Insert or Replace into <YourTable> 
last_sync, YT.<othercolumn>, YT.<othercolumn2>
from <YourTable> YT inner join <AnotherTable> ON
YT._id = AT._id 

https://www.sqlite.org/lang_insert.html

【讨论】:

    【解决方案2】:

    感谢您的回复,但经过一番研究,我决定使用批量更新。我发现只有两列的批量更新比预期的要快得多。 Nexus 5 在一秒钟内完成超过 2000 次更新,符合我的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多