استخدام قواعد بيانات SQLite متعددة في وقت واحد
-
08-06-2019 - |
سؤال
لدي قاعدتي بيانات SQLite، تم تنزيل إحداهما من الخادم (server.db
)، وواحد يستخدم للتخزين على العميل (client.db
).أحتاج إلى إجراء استعلامات مزامنة متنوعة في قاعدة بيانات العميل، باستخدام البيانات من قاعدة بيانات الخادم.
على سبيل المثال، أريد حذف جميع الصفوف في ملف client.db tRole
الجدول، وأعد ملؤه بجميع الصفوف الموجودة في server.db tRole
طاولة.
مثال آخر، أريد حذف جميع الصفوف في ملف client.db tFile
الجدول حيث fileID
ليس في server.db tFile
طاولة.
في SQL Server، يمكنك فقط إضافة اسم قاعدة البيانات إلى الجدول.هل هناك أي طريقة للقيام بذلك في SQLite باستخدام Adobe Air؟
المحلول
لقد ألقيت نظرة للتو على AIR SQL API، وهناك attach
طريقة على SQLConnection
يبدو بالضبط ما تحتاجه.
لم أختبر هذا، ولكن وفقًا للوثائق يجب أن يعمل:
var connection : SQLConnection = new SQLConnection();
connection.open(firstDbFile);
connection.attach(secondDbFile, "otherDb");
var statement : SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT INTO main.myTable SELECT * FROM otherDb.myTable";
statement.execute();
قد تكون هناك أخطاء في مقتطف التعليمات البرمجية هذا، ولم أعمل كثيرًا مع AIR SQL API مؤخرًا.لاحظ أن جداول قاعدة البيانات فتحت بـ open
متاحة باستخدام main.tableName
, ، يمكن إعطاء أي قاعدة بيانات مرفقة أي اسم على الإطلاق (otherDb
في المثال أعلاه).
نصائح أخرى
من الممكن فتح قواعد بيانات متعددة في وقت واحد في Sqlite، ولكن من المشكوك فيه أن يتم ذلك عند العمل من Flex/AIR.في عميل سطر الأوامر الذي تقوم بتشغيله ATTACH DATABASE path/to/other.db AS otherDb
وبعد ذلك يمكنك الرجوع إلى الجداول الموجودة في قاعدة البيانات تلك باسم otherDb.tableName
تمامًا كما هو الحال في MySQL أو SQL Server.
يمكن الإشارة إلى الجداول الموجودة في قاعدة البيانات المرفقة باستخدام صيغة قاعدة البيانات name.table-name.
هذا الكود يمكن أن يعمل فهو يكتب لي:
package lib.tools
import flash.utils.ByteArray;
import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.data.SQLResult;
import flash.data.SQLMode;
import flash.events.SQLErrorEvent;
import flash.events.SQLEvent;
import flash.filesystem.File;
import mx.core.UIComponent;
import flash.data.SQLConnection;
public class getConn {
public var Conn:SQLConnection;
public function getConn(database:Array) {
Conn = new SQLConnection();
var Key:ByteArray = new ByteArray();
Key.writeUTFBytes("Some16ByteString");
Conn.addEventListener(SQLErrorEvent.ERROR, createError);
var dbFile:File = File.applicationDirectory.resolvePath(database[0]);
Conn.open(dbFile);
if(database.length > 1) {
for(var i:Number = 1; i < database.length; i++) {
var DBname:String = database[i];
Conn.attach(DBname.split("\.")[0], File.applicationDirectory.resolvePath(DBname));
}
}
Conn.open(dbFile, SQLMode.CREATE, false, 1024, Key);
}
private function createError(event:SQLErrorEvent):void {
trace("Error code:", event.error.details);
trace("Details:", event.error.message);
}
public function Rs(sql:Array):Object {
var stmt:SQLStatement = new SQLStatement();
Conn.begin();
stmt.sqlConnection = Conn;
try {
for(var i:String in sql) {
stmt.text = sql[i];
stmt.execute();
}
Conn.commit();
} catch(error:SQLErrorEvent) {
createError(error);
Conn.rollback();
};
var result:Object =stmt.getResult();
return result;
}
}