gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:24:42 24 4
gpt4 key购买 nike

我基本上想在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com