actionscript 3 - Mehrere SQLite-Datenbanken gleichzeitig verwenden

Translate

Ich habe 2 SQLite-Datenbanken, eine von einem Server heruntergeladen (server.db) und eine, die als Speicher auf dem Client verwendet wird (client.db). Ich muss verschiedene Synchronisierungsabfragen für die Client-Datenbank ausführen und dabei Daten aus der Server-Datenbank verwenden.

Zum Beispiel möchte ich alle Zeilen in der löschenclient.db tRoleTabelle und füllen Sie mit allen Zeilen in derserver.db tRoleTabelle.

Ein weiteres Beispiel, ich möchte alle Zeilen in der löschenclient.db tFileTabelle, wo diefileIDist nicht in derserver.db tFileTabelle.

In SQL Server können Sie der Tabelle nur den Namen der Datenbank voranstellen. Gibt es überhaupt eine Möglichkeit, dies in SQLite mit Adobe Air zu tun?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Ich habe mir gerade die AIR SQL API angesehen und es gibt eineattachMethode aufSQLConnectiones sieht genau so aus, wie du es brauchst.

Ich habe dies nicht getestet, aber laut Dokumentation sollte es funktionieren:

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();

Möglicherweise enthält dieses Code-Snipplet Fehler. Ich habe in letzter Zeit nicht viel mit der AIR SQL-API gearbeitet. Beachten Sie, dass die Tabellen der Datenbank mit geöffnet wurdenopensind verfügbar mitmain.tableNamekann jeder angehängten Datenbank ein beliebiger Name zugewiesen werden (otherDbim obigen Beispiel).

Quelle
Translate

Es ist möglich, mehrere Datenbanken gleichzeitig in Sqlite zu öffnen, aber es ist zweifelhaft, ob dies bei der Arbeit mit Flex / AIR möglich ist. Im Befehlszeilenclient, den Sie ausführenATTACH DATABASE path/to/other.db AS otherDbund dann können Sie auf Tabellen in dieser Datenbank als verweisenotherDb.tableNamegenau wie in MySQL oder SQL Server.

Auf Tabellen in einer angehängten Datenbank kann mit der Syntax Datenbankname.Tabellenname verwiesen werden.

ATTACH DATABASE-Dokumentation unter sqlite.org

Quelle
James Lee
Translate

Dieser Code kann funktionieren, er ist von mir geschrieben:

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;
    }
}
Quelle