Frage

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

Ich möchte zum Beispiel alle Zeilen im löschen client.db tRole Tabelle und füllen Sie sie erneut mit allen Zeilen in der server.db tRole Tisch.

Ein weiteres Beispiel: Ich möchte alle Zeilen im löschen client.db tFile Tabelle, wo die fileID ist nicht in der server.db tFile Tisch.

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

War es hilfreich?

Lösung

Ich habe mir gerade die AIR SQL-API angesehen und da ist eine attach Methode auf SQLConnection Es sieht genau so aus, wie Sie es brauchen.

Ich habe das 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 sind in diesem Codeausschnitt Fehler enthalten. Ich habe in letzter Zeit nicht viel mit der AIR SQL-API gearbeitet.Beachten Sie, dass die Tabellen der Datenbank mit geöffnet wurden open stehen zur Verfügung main.tableName, jeder angehängten Datenbank kann ein beliebiger Name gegeben werden (otherDb im Beispiel oben).

Andere Tipps

Es ist möglich, mehrere Datenbanken gleichzeitig in SQLite zu öffnen, es ist jedoch zweifelhaft, ob dies bei der Arbeit mit Flex/AIR möglich ist.Im Befehlszeilen-Client, den Sie ausführen ATTACH DATABASE path/to/other.db AS otherDb und dann können Sie auf Tabellen in dieser Datenbank verweisen als otherDb.tableName genau 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

Dieser Code kann funktionieren, er schreibt von mir:

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;
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top