سؤال

أقوم بتطوير تطبيق في 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;
 };

تحديث حاول التعليق على جميع المكالمات إلى Lockfile and Lockfileex في Sqlite3.c - نفس النتيجة.

UPD2: حاول الاتصال SQLite3_Close عند الخمول (تماما كدليل على المفهوم) - لا تزال نفس النتيجة! يخبر Filemon أن الملف لا يزال غير مغلق، فقط غير مقفلة.

UPD3: وضع AutoCommit قيد التشغيل. أعداد البدء وتنفذ المباراة (الصفقة الفئة والراي تعتني بذلك). Sqlitemanager قادر على الاتصال DB أثناء تشغيل التطبيق الخاص بي وإجراء تعديلات عليه.

هل كانت مفيدة؟

المحلول

التحقق من النتيجة من SQLite3_Close (). ربما لا يعمل لأنك لم تنهي جميع بياناتك المعدة.

نصائح أخرى

ما نظام الملفات التي تستخدمها؟

هل أنت متأكد من أن AutoCommit على و / أو أنك ترتكز بياناتك؟ أتذكر وجود مشكلة مع عدم الالتزام وسيظل القفل.

يحتوي Alex Pechnikov على برنامج النسخ المتماثل لقاعدة بيانات SQLite Multi-Master sqlite3-rdiff.. وبعد من المحتمل أن تكون مبالغة فيما تحاول إنجازه، ولكن قد يكون أسهل من النسخ المتماثل للملفات.

sqlite لديها أيضا API النسخ الاحتياطي عبر الإنترنت; ؛ هناك مثال على تلك الصفحة: مثال 2: النسخ الاحتياطي عبر الإنترنت لقاعدة بيانات قيد التشغيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top