5

データの保存にSQLite3DBを使用するVisualC++でアプリを開発しています。通常、それはほとんどの場合トレイにあります。

また、アプリをDropBoxフォルダーに入れて、複数のPCで共有できるようにしたいと思います。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: sqlite3.cのLockFileとLockFileExへのすべての呼び出しをコメントアウトしようとしました-同じ結果です。

UPD2:アイドル時にsqlite3_closeを呼び出そうとしました(概念実証と同じように)-それでも同じ結果です!Filemonは、ファイルがまだ閉じられておらず、ロックが解除されているだけであることを通知します。

UPD3:自動コミットモードがオンになっています。BEGINとCOMMITの数は一致します(クラスTransactionとRAIIがそれを処理します)。SQliteManagerは、アプリの実行中にDBに接続し、変更を加えることができます。

4

3 に答える 3

4

sqlite3_close()からの結果を確認します。準備されたステートメントをすべて完成させていないため、おそらく機能していません。

于 2010-03-18T03:02:00.383 に答える
2

どのファイルシステムを使用していますか?

自動コミットがオンになっていること、および/またはステートメントをコミットしていることを確認しますか?コミットしないという問題があり、ロックがオンのままになることを覚えています。

于 2010-03-14T08:10:01.157 に答える
2

Alex Pechnikovには、マルチマスターSQLiteデータベースレプリケーションプログラムsqlite3-rdiffがあります。達成しようとしていることにはおそらくやり過ぎですが、ファイルの複製よりも簡単な場合があります。

SQLiteにはオンラインバックアップAPIもあります。そのページに例があります。例2:実行中のデータベースのオンラインバックアップ。

于 2010-03-14T22:45:12.790 に答える