سؤال

لدي قاعدتي بيانات 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.

إرفاق وثائق قاعدة البيانات على sqlite.org

هذا الكود يمكن أن يعمل فهو يكتب لي:

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;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top