2008-08-05 15 views
7

Tengo 2 bases de datos SQLite, una descargada de un servidor (server.db) y una utilizada como almacenamiento en el cliente (client.db). Necesito realizar varias consultas de sincronización en la base de datos del cliente, usando datos de la base de datos del servidor.Uso de múltiples bases de datos SQLite a la vez

Por ejemplo, deseo eliminar todas las filas en la tabla client.db tRole y volver a llenar todas las filas en la tabla server.db tRole.

Otro ejemplo, quiero eliminar todas las filas en la tabla client.db tFile donde fileID no está en la tabla server.db tFile.

En SQL Server puede simplemente poner un prefijo a la tabla con el nombre de la base de datos. ¿Hay alguna forma de hacerlo en SQLite usando Adobe Air?

+0

"No hay manera de hacer esto desde el nivel de base de datos." ¿Cómo es eso? SQLite tiene una palabra clave 'attach' que le permite adjuntar otra base de datos. Y la respuesta de Theo muestra que Air parece tener una llamada API correspondiente. ¿Hay alguna distinción que me falta cuando dices específicamente "desde el nivel de la base de datos"? – spaaarky21

Respuesta

7

Yo miraba a la API de AIR SQL, y no hay un método attach en SQLConnection se ve exactamente lo que necesita.

no he probado esto, pero de acuerdo a la documentación debería funcionar:

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

Puede haber errores en el código snipplet, no he trabajado mucho con la API de AIR SQL últimamente. Observe que las tablas de la base de datos abierta con open están disponibles usando main.tableName, cualquier base de datos adjunta puede recibir cualquier nombre (otherDb en el ejemplo anterior).

1

Es posible abrir varias bases de datos a la vez en Sqlite, pero es dudoso que se pueda hacer cuando se trabaja desde Flex/AIR. En el cliente de la línea de comandos, ejecuta ATTACH DATABASE path/to/other.db AS otherDb y luego puede consultar tablas en esa base de datos como otherDb.tableName, al igual que en MySQL o SQL Server.

Las tablas de una base de datos adjunta pueden consultarse utilizando la sintaxis nombre-base de datos.nombre-tabla.

ATTACH DATABASE documentation at sqlite.org

0

este código puede ser un trabajo, es escribir de mí:

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