Как эффективно массово обновить список тегов для элемента в SQLite? - PullRequest
1 голос
/ 02 января 2012

Я в основном хочу сделать операцию набора дополнений в SQLite, но не знаю как.

Скажем, у меня есть список тегов для такого элемента в памяти:

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

и база данных имеет эти теги, связанные с тем же элементом:

"red", "orange", "purple"

Я хочу, чтобы база данных отображала состояние в памяти. Мне нужно:

  1. Удалить связь с тегами для элемента в базе данных, которые не существуют в памяти. Исключить «органж» и «фиолетовый».
  2. Добавить отношения тегов, которых у меня нет в базе данных, но в памяти. Добавьте «синий», «зеленый» и «желтый».

Я мог бы просто взять весь список существующих тегов и выполнить операцию вне SQL с Java (на Android), но это мог бы быть огромный список, и я делаю это на мобильном устройстве.

Я мог бы также отбросить все существующие связи тегов для элемента, а затем добавить их в память, но это может потенциально добавить много отношений, которые уже существуют и кажутся ненужной работой.

У меня в основном есть следующие таблицы:

пункт * * 1023

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

Ответы [ 2 ]

1 голос
/ 02 января 2012

Скажем, у меня есть список тегов для такого элемента в памяти ... и в базе данных есть эти теги, связанные с этим же элементом

Один из подходов - этоПредставление в памяти содержит текущее и последнее сохраненное состояние.

Затем, когда придет время обновить базу данных, вы точно знаете, что нужно ВСТАВИТЬ и УДАЛИТЬ из tagged_items (и,возможно, INSERTed в tags), выполняя операции установки разности .

Это предполагает, что вы либо:

  • избавитесь от постороннего целочисленного первичного ключадля вашей таблицы tags, поскольку тег уже должен быть уникальным, или
  • вы храните в памяти и тег, и его идентификатор

Возможно, вам удастся избежать удержаниятолько тег в памяти через sub-SELECT для получения id из текста тега, но лично я бы просто обнулил столбец id из tags.

Когда вы выполняете базу данных, я /О, оберните все это в сделкупотому что по логике работа должна быть успешной или неуспешной в целом, но для повышения производительности с помощью SQLite на Android.

Другой подход - избавиться от прямого доступа к SQLite и переключиться на что-то вроде ORMLite., который может справиться с подобными вещами для вас.Я не использовал это лично.

0 голосов
/ 11 мая 2016

Я бы отсортировал оба списка по "item_id + tag_id" и убедился бы, что выбор базы данных влияет только на те itemID, которые есть в списке памяти.

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-синий дБ 97,5-оранжевый
    • mem <дБ </li>
    • вставить 97,2-синий
    • аванс mem
  • mem 97,3-зеленый дБ 97,5-оранжевый
    • mem <дБ </li>
    • вставить 97,3-зеленый
    • аванс мем
  • мем 97,4-йо дб 97,5-оранжевый
    • мем <дБ </li>
    • вставка97,4-йелло
    • аванс мем
  • мем 98,4-йелло дБ 97,5-оранжевый
    • мем> дб (следующий элемент памяти), 97,5-оранжевого больше нет в БД)
    • удалить 97,5-оранжевого
    • заранее дБ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...