2008-08-05 36 views
7

J'ai 2 bases de données SQLite, une téléchargée à partir d'un serveur (server.db), et une utilisée comme stockage sur le client (client.db). J'ai besoin d'effectuer diverses requêtes de synchronisation sur la base de données client, en utilisant des données de la base de données du serveur. Par exemple, je souhaite supprimer toutes les lignes de la table client.db tRole et repeupler toutes les lignes du tableau server.db tRole.Utilisation de plusieurs bases de données SQLite à la fois

Un autre exemple, je veux supprimer toutes les lignes dans la table client.db tFile où le fileID n'est pas dans la table server.db tFile.

Dans SQL Server, vous pouvez simplement préfixer la table avec le nom de la base de données. Est-il possible de le faire dans SQLite en utilisant Adobe Air?

+0

« Il n'y a pas moyen de le faire à partir du niveau de base de données. » Comment? SQLite a un mot-clé 'attach' qui vous permet d'attacher une autre base de données. Et la réponse de Theo montre que Air semble avoir un appel d'API correspondant. Y a-t-il une distinction qui me manque lorsque vous dites spécifiquement «du niveau de la base de données»? – spaaarky21

Répondre

7

Je viens de regarder l'API AIR SQL, et il y a une méthode attach sur SQLConnection il semble exactement ce dont vous avez besoin.

Je ne l'ai pas testé, mais d'après la documentation il devrait fonctionner:

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

Il peut y avoir des erreurs dans ce code snipplet, je ne l'ai pas beaucoup travaillé avec l'API SQL AIR ces derniers temps. Notez que les tables de la base de données ouverte avec open sont disponibles en utilisant main.tableName, n'importe quelle base de données attachée peut recevoir n'importe quel nom (otherDb dans l'exemple ci-dessus).

1

Il est possible d'ouvrir plusieurs bases de données à la fois dans Sqlite, mais il est douteux que cela puisse être fait avec Flex/AIR. Dans le client de ligne de commande, vous exécutez ATTACH DATABASE path/to/other.db AS otherDb et vous pouvez ensuite vous référer aux tables de cette base de données en tant que otherDb.tableName comme dans MySQL ou SQL Server.

Les tables d'une base de données attachée peuvent être référencées en utilisant la syntaxe database-name.table-name.

ATTACH DATABASE documentation at sqlite.org

0

ce code peut être un travail, il est d'écrire de moi:

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