Я разрабатываю приложение в Visual C++, который использует SQLite3 DB для того, чтобы хранить данные. Обычно это находится в лотке большую часть времени.
Я также хотел бы позволить поместить свое приложение в папку DropBox для совместного использования его через несколько ПК. Это работало действительно хорошо вплоть до Dropbox, недавно обновил себя. И теперь это говорит, что "не может синхронизировать используемый файл". Файл SQLite открыт в моем приложении, но блокировка совместно используется. Существуют некоторые подготовленные операторы, но все сразу сбрасываются после использования step
.
Там какой-либо путь состоит в том, чтобы позволить синхронизироваться открытого файла базы данных SQLite?Спасибо!
Вот простая обертка, которую я использую только для тестирования (никакая обработка ошибок), в случае, если это помогает:
class Statement
{
private:
Statement(sqlite3* db, const std::wstring& sql) : db(db)
{
sqlite3_prepare16_v2(db, sql.c_str(), sql.length() * sizeof(wchar_t), &stmt, NULL);
}
public:
~Statement() { sqlite3_finalize(stmt); }
public:
void reset() { sqlite3_reset(stmt); }
int step() { return sqlite3_step(stmt); }
int getInt(int i) const { return sqlite3_column_int(stmt, i); }
std::wstring getText(int i) const
{
const wchar_t* v = (const wchar_t*)sqlite3_column_text16(stmt, i);
int sz = sqlite3_column_bytes16(stmt, i) / sizeof(wchar_t);
return std::wstring(v, v + sz);
}
private:
friend class Database;
sqlite3* db;
sqlite3_stmt* stmt;
};
class Database
{
public:
Database(const std::wstring& filename = L"")) : db(NULL)
{
sqlite3_open16(filename.c_str(), &db);
}
~Database() { sqlite3_close(db); }
void exec(const std::wstring& sql)
{
auto_ptr<Statement> st(prepare(sql));
st->step();
}
auto_ptr<Statement> prepare(const std::wstring& sql) const
{
return auto_ptr<Statement>(new Statement(db, sql));
}
private:
sqlite3* db;
};
UPD: Попробованное комментирование всех вызовов к LockFile и LockFileEx в sqlite3.c - тот же результат.
UPD2: Попробованный для вызова sqlite3_close, когда неактивным (так же, как подтверждение концепции) - все еще тот же результат! Filemon говорит, что файл все еще не закрыт, только разблокирован.
UPD3: режим Автоматической фиксации идет. Числа НАЧИНАЮТ и ФИКСИРУЮТ соответствие (класс Транзакция, и RAII заботятся об этом). SQliteManager может соединиться с DB, в то время как мое приложение работает, и сделайте модификации к нему.
Проверка результата sqlite3_close () . Возможно, это не работает, потому что вы не завершили все свои подготовленные заявления.
Какую файловую систему вы используете?
Вы уверены, что автоматическая фиксация включена и / или что вы фиксируете свои утверждения? Я помню, что у меня была проблема с отказом от фиксации, и блокировка оставалась включенной.
Алекс Печников имеет программу репликации базы данных SQLite с несколькими мастерами sqlite3-rdiff . Вероятно, это перебор для того, что вы пытаетесь выполнить, но это может быть проще, чем репликация файлов.
SQLite также имеет Online Backup API ; на этой странице есть пример: Пример 2: Онлайн-резервное копирование работающей базы данных.