Обновление / Слияние таблицы БД SQLite из объектов Java - PullRequest
6 голосов
/ 13 июня 2011

Вот минимальный пример для описания проблемы:

Предположим, что таблица читается из SQLiteDB и сохраняется в объекте коллекции Java

Таблица БД ---> Объект Java


idRecord | Data   (table stored at DB)
1         One
2         Two
3         Three
4         Four

И через библиотеку sqlite jdbc :

Map objTable = new HashMap ();//... добавив некоторые вещи jdbc, мы получим копию DBTable в objTable

Затем, если объект изменен, таким образом, будет.

idRecord | Data   (modified table stored at objTable)    
2         Two
4         FourModified
5         Five

(идентификаторы 1 и 3 были удалены, 2 остались прежними, 4 изменены и 5 добавлены)

Объект Java -> таблица БД (вот вопрос ...)


Как обновить / объединить таблицу объектов с БД?

Почему я хочу объединить, а не просто сохранить объект в таблицу ?

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

  • Удалите весь DBtable и в цикле (опасного, в то же время) обойдите объект, чтобы написать новую таблицу.

  • Считайте DBtable во втором java-объекте, а затем сравните оба (скакое-то объединение алгоритма) и применить действия (ДОБАВИТЬ, УДАЛИТЬ, ИЗМЕНИТЬ) непосредственно к БД.(Я бы принял рекомендацию для этого алгоритма сравнения)

  • РЕДАКТИРОВАТЬ: Во-первых, не создавать Коллекцию, читать и писать напрямуюиз БД, постоянно передавая запросы через JDBC

  • Другой лучший подход

Thanks4Reading

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Два оператора в одной транзакции.(к сожалению, SQLite не поддерживает функциональность ON DUPLICATE KEY UPDATE, но, эй, это «Lite»: P)

Сначала INSERT OR IGNORE, затем UPDATE yourtable SET data = hashTableData WHERE id = hashTableId AND data!= hashTableData

Возможно, вы сможете определить, какие из них были проигнорированы.Я попытался бы сделать два подготовленных утверждения, я предполагаю, что execute вернет false, если предложение ignore было запущено.Попытайся.

Если это так, то выполнить обновление на false.

В противном случае зацикливать данные дважды по одному разу для каждого оператора и фиксировать переход по завершении:)

0 голосов
/ 23 июня 2011

Вы можете реализовать поведение, аналогичное (упрощенное) поведение кэша сеанса Hibernate.Ваше представление памяти может содержать «грязный» флаг, который указывает, какие объекты необходимо обновить в базе данных, а какие - удалить.В зависимости от алгоритма, который вы используете для распределения идентификаторов (ориентированных на приложения или на базы данных), вы можете идентифицировать объекты, которые были добавлены по специальному значению (скажем, 0) или сохраняя эту информацию в грязном флаге.* Еще одно потенциальное улучшение заключается в том, чтобы рассмотреть стремление (прочитать все записи сразу) против ленивой (читать записи по мере необходимости) загрузки вашего кэша.

0 голосов
/ 14 июня 2011

Отслеживание записей, которые были изменены в ArrayList чего-то подобного. Затем, когда придет время обновить БД, обновите только те записи, которые были изменены.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...