java - 如何有效地批量更新 SQLite 中项目的标签列表?

标签 java android sqlite

我基本上想在 SQLite 中执行补集操作,但不确定如何操作。

假设我在内存中有这样一个项目的标签列表:

"red", "blue", "green", "yellow"

并且数据库具有与同一项目关联的这些标签:

"red", "orange", "purple"

我想要的是让数据库反射(reflect)内存中的状态。我需要:

  1. 删除数据库中不存在于内存中的项目与标签的关系。删除“橙色”和“紫色”。
  2. 添加我在数据库中没有但在内存中有的标记关系。添加“蓝色”、“绿色”和“黄色”。

我可以简单地获取现有标记的整个列表,并使用 Java(在 Android 上)在 SQL 之外执行操作,但这可能是一个巨大的列表,而我正在移动设备上执行此操作。

我也可以删除该项目的所有现有标签关系,然后在内存中添加这些标签关系,但这可能会添加很多已经存在的关系,看起来像是不必要的工作。

我基本上有以下表格:

项目

id, int primary key autoincrement not null
name, text

标签

id, int primary key autoincrement not null
name text

tagged_items

id, int primary key autoincrement not null
tag_id, int
item_id, int

最佳答案

Say I have a list of tags for an item like this in memory... and the database has these tags associated with the same item

一种方法是让您的内存中表示同时保存当前状态和最后保存的状态。

然后,当需要更新数据库时,您确切地知道需要从 tagged_items 中插入和删除什么(并且可能插入到 tags 中),通过执行 set difference operations .

这假设您:

  • 为您的 tags 表去掉多余的整数主键,因为标签应该已经是唯一的,或者
  • 你在内存中保存标签及其 ID

您也许可以通过子选择仅将标签保存在内存中以从标签文本中派生 id,但我个人只是核对 id 来自 tags 的列。

当您执行数据库 I/O 时,将其全部包装在一个事务中,这不仅是因为从逻辑上讲工作应该作为一个整体成功或失败,而且还可以提高 Android 上 SQLite 的性能。

另一种方法是让您摆脱直接的 SQLite 访问并切换到类似 ORMLite 的方式可能会为你处理这类事情。我个人没有使用过它。

关于java - 如何有效地批量更新 SQLite 中项目的标签列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695874/

相关文章:

JavaFX 在带有动画的条形图中可视化算法

java.lang.IllegalStateException : Could not execute method of the activity (trying to send a mail)

android - 动画切换按钮

python - 如何使用 Django 连接 3 个表进行查询

ios - 如何使用 FMDB 从 sqlite 检索数据并保存在数组中

java - 无法启动 Eclipse 3.5.2?

java - spring auth错误没有AuthenticationProvider

安卓 3.0.1 错误 :Unable to resolve dependency for ':app@debug/compileClasspath' : Could not resolve project :app2

android - 将 AS 更新到 1.0 后,项目中出现 "method ID not in [0, 0xffff]: 65536"错误

c++ - QSqlDatabase::open() 始终返回 true Qt 5.3.2