только для чтения база данных sqlite с временными изменениями - PullRequest
1 голос
/ 24 августа 2009

У меня есть база данных sqlite, и я хотел бы сохранить ее только для чтения без каких-либо операций записи в файл базы данных.

Есть ли способ внести временные изменения в базу данных, не сбрасывая их на диск навсегда?

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

В идеале, решение этой проблемы будет обрабатывать дополнительные временные данные, как если бы они были частью основной базы данных, но фактически не записывать их на диск.

Ответы [ 3 ]

2 голосов
/ 24 августа 2009

Поскольку SQLite является транзакцией , этого должно быть достаточно, чтобы не выполнять транзакцию COMMIT (SQLite автоматически откатит ее при закрытии соединения). Вы должны отключить autocommit с помощью оператора BEGIN.

1 голос
/ 24 августа 2009
BEGIN IMMEDIATE TRANSACTION;
do a bunch of stuff;
ROLLBACK TRANSACTION;

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

Теперь, есть что-то забавное в использовании транзакций таким образом, как насчет того, чтобы между вами и базой данных был программный слой в стиле ORM, который работает непосредственно с вашими собственными объектами и сохраняет временные изменения в памяти? *

Я имею в виду, если вы не хотите менять базу данных, возможно, вам нужен другой слой кода, а не функция базы данных?

1 голос
/ 24 августа 2009

Вы можете создать временную таблицу , которая будет автоматически удалена из БД при закрытии соединения.

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