SQLite БД из памяти в файл, из файла в память, А также вопрос подключения библиотеки SQLite |
Здравствуйте, гость ( Вход | Регистрация )
SQLite БД из памяти в файл, из файла в память, А также вопрос подключения библиотеки SQLite |
Frigolem |
30.11.2010, 12:28
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 24.9.2008 Пользователь №: 297 Спасибо сказали: 3 раз(а) Репутация: 0 |
Собственно, очень интересует, как по-нормальному реализовать сохранение/загрузку SQLite БД из памяти / в память.
Сейчас я покажу, как делать не надо. Примеры нехорошие, но рабочие. Я их показываю только потому, что пока что иных рабочих способов не нашёл. Нехороший рабочий пример записи SQLite БД из :memory: в файл
Нехороший рабочий пример чтения SQLite БД из файла в :memory:
Так делать в первую очередь не хорошо, потому что лично мне не известно, гарантированно ли вся БД перенесётся (достаточно ли только таблиц, индексов и sqlite_sequence). Во-вторых, если записей много, то операция получается вовсе не быстрой, так как делается множество малополезных в данной ситуации построчных операций. Теперь о том, как было бы неплохо реализовать по-нормальному. На сайте SQLite есть статья, где рассказывается о том, что вообще для сохранения БД из памяти в файл и наоборот используется механизм резервирования. Приведены даже примеры как. Но, как становится понятно из статьи, делается это через SQLite API. В Qt для таких случаев, вроде бы, предусмотрена возможность получить хэндлер API-шного подключения: QSqlDriver->Handle(); Есть в справке даже пример получения такого хэндлера. Процитирую пример
Я нашёл ещё одну возможно полезную в данной ситуации статью. Там как раз вопрос про работу с SQLite API, и там у автора темы даже что-то вроде бы получилось. Автор говорит, что ему помогло вот так: Цитата("Автор говорит") The problem is solved by adding Судя по "/usr/lib" это, скорее всего, вариант для Linux. Также, скорее всего, SQLite там был установлен отдельно (коли в /usr/lib).the following line to the .pro file LIBS += -L/usr/lib -lsqlite3 and added #include "sqlite3.h" Собственно вопрос Господа, не подскажете, а как можно подключить SQLite библиотеку под Windows? И обязательно ли это должна быть отдельная библиотека (а не из комплекта Qt)? |
|
|
Frigolem |
30.11.2010, 15:48
Сообщение
#2
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 24.9.2008 Пользователь №: 297 Спасибо сказали: 3 раз(а) Репутация: 0 |
О! Получилось таки
Вот стоило спросить на форуме, как наконец докопался. Можно использовать SQLite API, идущий в комплекте с Qt. Оказалось, что никаких дополнительных библиотек делать не обязательно, достаточно просто приинклудить sqlite3.h, но при этом sqlite3.c соответственно нужно откомпилировать (оказывается, Qt без особых указаний на это его не откомпилирует). Итак, действия примерно такие: 1. В .pro файл добавляем две строки:
2. В файл, где собираемся использовать SQLite API, добавляем:
3. После чего можно использовать примерно вот такую функцию для загрузки/сохранения SQLite БД из памяти / в память: Нормальная функция сохранения/загрузки БД SQLite
|
|
|
igor_bogomolov |
30.11.2010, 17:07
Сообщение
#3
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Frigolem, может оформите заметку на нашу Wiki?
|
|
|
Frigolem |
30.11.2010, 18:28
Сообщение
#4
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 24.9.2008 Пользователь №: 297 Спасибо сказали: 3 раз(а) Репутация: 0 |
Попробую написать заметки в раздел Qt/FAQ
|
|
|
Frigolem |
9.12.2010, 19:50
Сообщение
#5
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 24.9.2008 Пользователь №: 297 Спасибо сказали: 3 раз(а) Репутация: 0 |
Бага обнаружилась.
Вот так делать нельзя: Я чегой-то думал, что суровый будничный стек не уничтожит промежуточно создаваемый QByteArray ( его делает метод .toLocal8Bit() ) и я успею без проблем по-использовать указатель на строчку. Ан-нет, массив убивается уже походу следующих операций, наверно в результате оптимизации.Поэтому, предлагаю в коде поста №2 сделать замену приведённой строки на эти две:
В wiki также поправлю... |
|
|
Litkevich Yuriy |
12.12.2010, 17:51
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Я чегой-то думал, что суровый будничный стек не уничтожит промежуточно создаваемый QByteArray ( его делает метод .toLocal8Bit() ) и я успею без проблем по-использовать указатель на строчку. Ан-нет, массив убивается уже походу следующих операций, наверно в результате оптимизации. это поведение стандартное. Т.к. QByteArray объект временный.Также ожидай проблем и тут:
Т.к. на следующей строке после этой функции временный объект умрёт |
|
|
Текстовая версия | Сейчас: 9.11.2024, 3:46 |