actionscript-3 - tutorial - select sqlite android
Usar múltiples bases de datos SQLite a la vez (3)
Tengo 2 bases de datos SQLite, una descargada de un servidor ( server.db
) y otra 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.
Por ejemplo, deseo eliminar todas las filas en la client.db tRole
y volver a client.db tRole
con todas las filas en la server.db tRole
.
Otro ejemplo, quiero eliminar todas las filas en la client.db tFile
donde el fileID
no se encuentra en la server.db tFile
.
En SQL Server puede simplemente ponerle un prefijo a la tabla con el nombre de la base de datos. ¿Hay alguna forma de hacerlo en SQLite usando Adobe Air?
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 comandos, ejecuta ATTACH DATABASE path/to/other.db AS otherDb
y luego puede hacer referencia a tablas en esa base de datos como otherDb.tableName
igual que en MySQL o SQL Server.
Se puede hacer referencia a las tablas en una base de datos adjunta utilizando la sintaxis nombre-base de datos.nombre-tabla.
Acabo de ver la API de AIR SQL, y hay un método de attach
en SQLConnection
se ve exactamente lo que necesita.
No lo he probado, pero de acuerdo con 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 snipplet de código, no he trabajado mucho con la API de AIR SQL últimamente. Tenga en cuenta que las tablas de la base de datos abierta con open
están disponibles con main.tableName
, cualquier base de datos adjunta puede recibir cualquier nombre ( otherDb
en el ejemplo anterior).
este código puede ser un trabajo, es escribir sobre 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;
}
}