2012-01-01 64 views
1

我基本上想在SQLite中做補充集操作,但不知道如何。如何高效批量更新SQLite中項目的標籤列表?

說我有標籤列表在內存中像這樣的項目:

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

和數據庫與同一項目相關的這些標籤:

"red", "orange", "purple" 

我想是讓數據庫反映內存中的狀態。我需要:

  1. 刪除與數據庫中不存在於內存中的項目的標記的關係。刪除「organge」和「purple」。
  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 

回答

1

說我有標籤列表像這樣在內存中的內容...和數據庫具有相同的項目

一個辦法是讓你的內存中表示相關的這些標籤都保持在當前狀態和最後持久狀態。

然後,當需要更新數據庫時,通過執行set difference operations,您確切知道需要從tagged_items(並且可能插入到tags)中插入和刪除哪些內容。

這假定您:

  • 擺脫多餘的整數主鍵爲您tags表,因爲標籤應該是唯一已經或
  • 你在內存中保留兩個標記及其ID

您也許能只持有該標籤在通過子選擇存儲導出從標籤文本的id脫身,但我個人剛從核彈id列。

當你做對數據庫I/O,其包裝都在交易,這不僅是因爲邏輯上的工作應該成功或失敗作爲一個整體,而是以提高性能與Android的SQLite。

另一種方法是讓你擺脫你的直接SQLite訪問並切換到像ORMLite這樣的東西,可以爲你處理這種事情。我沒有親自使用它。

+0

如果我擺脫了標籤ID,我是否需要標籤表? – 2012-01-02 01:27:22

+0

@BjornTipling:也許不是。如果性能足夠好,'tagged_items'上的'SELECT DISTINCT'可以爲您提供一組使用中的標籤。如果你有定義標籤的概念沒有標籤項目,這會迫使你在其他地方維護定義標籤的名單。 – CommonsWare 2012-01-02 12:22:26

0

我都列出了「ITEM_ID + TAG_ID」和排序使舒爾數據庫選擇隻影響那些在記憶列表itemIDs。

select item_id, tag_id from tagged_items 
    where item_id in (... list of memory item_id ...) 
    order by item_id, tag_id 

然後

  • 要麼提前較小列表項或
  • 或推進兩個列表項如果兩個列表項相等

實施例:

假設這些tag_ids: 「紅色」= 1時, 「藍色」= 2, 「綠」= 3, 「黃色」= 4, 「橙」= 5 「紫色」= 6。 當前示例性數據的ITEM_ID是97

  • MEM 97,1紅色分貝97,1紅色
    • 兩個相同
    • 沒有分貝動作
    • 提前兩個
  • mem 97,2-blue db 97,5-orange
    • mem <分貝
    • 插入97.2藍色
    • 提前MEM
  • MEM 97.3綠色DB 97.5橙色
    • MEM<分貝
    • 插入97,3-綠色
    • advance mem
  • mem 97.4-yello db 97, 5 - 橙色
    • MEM<分貝
    • 插入97,4-黃釉
    • 預先MEM
  • MEM 98.4-黃釉分貝97,5橙色
    • MEM> db(next mem item,97,5-orange不在DB中)
    • 刪除97,5-orange
    • advan ce db
+0

我假設這個解決方案几乎等同於@CommonsWare版本,但是它用「舊狀態db光標」代替了「保留內存中的舊狀態」。此解決方案也應該用於組合兩個android內容解析器 – k3b 2016-05-11 13:59:21