Pregunta

Tengo 2 bases de datos SQLite, una descargada de un servidor (server.db), y uno utilizado como almacenamiento en el cliente (client.db).Necesito realizar varias consultas de sincronización en la base de datos del cliente, utilizando datos de la base de datos del servidor.

Por ejemplo, quiero eliminar todas las filas del client.db tRole tabla y volver a llenarla con todas las filas del server.db tRole mesa.

Otro ejemplo, quiero eliminar todas las filas del client.db tFile mesa donde el fileID no esta en el server.db tFile mesa.

En SQL Server, puede anteponer a la tabla el nombre de la base de datos.¿Existe alguna forma de hacer esto en SQLite usando Adobe Air?

¿Fue útil?

Solución

Acabo de mirar la API de AIR SQL y hay una attach método en SQLConnection Se ve exactamente lo que necesitas.

No lo he probado, pero según 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 ese fragmento de código. Últimamente no he trabajado mucho con la API de AIR SQL.Observe que las tablas de la base de datos abiertas con open están disponibles usando main.tableName, cualquier base de datos adjunta puede recibir cualquier nombre (otherDb en el ejemplo anterior).

Otros consejos

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 línea de comando que ejecuta ATTACH DATABASE path/to/other.db AS otherDb y luego puede hacer referencia a las tablas en esa base de datos como otherDb.tableName al igual que en MySQL o SQL Server.

Se puede hacer referencia a las tablas de una base de datos adjunta utilizando la sintaxis nombre-base-datos.nombre-tabla.

ADJUNTAR documentación de la BASE DE DATOS en sqlite.org

Este código puede funcionar, escríbeme:

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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top