2008-08-05 21 views
7

Ich habe 2 SQLite-Datenbanken, eine von einem Server (server.db) heruntergeladen und eine als Speicher auf dem Client (client.db). Ich muss verschiedene Sync-Abfragen in der Client-Datenbank ausführen, wobei Daten aus der Server-Datenbank verwendet werden.Verwenden mehrerer SQLite-Datenbanken auf einmal

Zum Beispiel möchte ich alle Zeilen in der client.db tRole Tabelle löschen und mit allen Zeilen in der server.db tRole Tabelle neu füllen.

Ein anderes Beispiel, ich möchte alle Zeilen in der client.db tFile Tabelle löschen, wo die fileID nicht in der server.db tFile Tabelle ist.

In SQL Server können Sie der Tabelle einfach den Namen der Datenbank voranstellen. Gibt es das in SQLite mit Adobe Air?

+0

Wie das? SQLite hat ein 'attach'-Schlüsselwort, mit dem Sie eine andere Datenbank anhängen können. Und Theos Antwort zeigt, dass Air anscheinend einen entsprechenden API-Aufruf hat. Gibt es eine Unterscheidung, die ich vermisse, wenn Sie ausdrücklich "von der Datenbankebene" sagen? – spaaarky21

Antwort

7

ich an der AIR SQL API nur sah, und es gibt eine attach Methode auf SQLConnection es genau sieht, was Sie brauchen.

ich nicht getestet habe, sondern nach der 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(); 

Es Fehler in diesem Code snipplet sein kann, ich habe nicht viel mit dem AIR-SQL-API in letzter Zeit gearbeitet. Beachten Sie, dass die mit open geöffneten Tabellen der Datenbank unter Verwendung von main.tableName verfügbar sind. Jede angeschlossene Datenbank kann einen beliebigen Namen erhalten (im obigen Beispiel).

1

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 können Sie ATTACH DATABASE path/to/other.db AS otherDb ausführen und dann können Sie wie in MySQL oder SQL Server auf Tabellen in dieser Datenbank als otherDb.tableName verweisen.

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

ATTACH DATABASE documentation at sqlite.org

0

Dieser Code kann sein Werk ist es schreiben mir: „Es gibt nicht diese Art und Weise aus der Datenbank-Ebene zu tun“

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