Usando múltiples bases de datos SQLite a la vez
-
08-06-2019 - |
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?
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.
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;
}
}