当前位置:  开发笔记 > 编程语言 > 正文

SQLite文件锁定和DropBox

如何解决《SQLite文件锁定和DropBox》经验,为你挑选了0个好方法。

我正在开发一个使用SQLite3数据库存储数据的Visual C++应用程序.通常它大部分时间都在托盘中.

我还想将我的应用程序放在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 st(prepare(sql));
   st->step();   
  }

  auto_ptr prepare(const std::wstring& sql) const
  {
   return auto_ptr(new Statement(db, sql));
  }

 private:
  sqlite3* db;
 };

UPD:尝试在sqlite3.c中注释掉对LockFile和LockFileEx的所有调用 - 结果相同.

UPD2:尝试在空闲时调用sqlite3_close(仅作为概念证明) - 仍然是相同的结果!Filemon告诉该文件仍未关闭,仅解锁.

UPD3:自动提交模式已启用.BEGIN和COMMIT的数量匹配(类Transaction和RAII负责).SQliteManager能够在我的应用程序运行时连接到数据库并对其进行修改.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有