我基本上想在 SQLite 中执行补集操作,但不确定如何操作。
假设我在内存中有这样一个项目的标签列表:
"red", "blue", "green", "yellow"
并且数据库具有与同一项目关联的这些标签:
"red", "orange", "purple"
我想要的是让数据库反射(reflect)内存中的状态。我需要:
- 删除数据库中不存在于内存中的项目与标签的关系。删除“橙色”和“紫色”。
- 添加我在数据库中没有但在内存中有的标记关系。添加“蓝色”、“绿色”和“黄色”。
我可以简单地获取现有标记的整个列表,并使用 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/