Utilizzo di più database SQLite contemporaneamente
-
08-06-2019 - |
Domanda
Ho 2 database SQLite, uno scaricato da un server (server.db
) e uno utilizzato come storage sul client (client.db
).Devo eseguire varie query di sincronizzazione sul database del client, utilizzando i dati del database del server.
Ad esempio, voglio eliminare tutte le righe nel file client.db tRole
tabella e ripopolarla con tutte le righe nella tabella server.db tRole
tavolo.
Un altro esempio, voglio eliminare tutte le righe nel file client.db tFile
tabella dove il fileID
non è nel server.db tFile
tavolo.
In SQL Server puoi semplicemente anteporre alla tabella il nome del database.Esiste comunque la possibilità di farlo in SQLite utilizzando Adobe Air?
Soluzione
Ho appena esaminato l'API AIR SQL e c'è un file attach
metodo attivo SQLConnection
sembra esattamente ciò di cui hai bisogno.
Non l'ho testato, ma secondo la documentazione dovrebbe funzionare:
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();
Potrebbero esserci errori in quello snipplet di codice, ultimamente non ho lavorato molto con l'API AIR SQL.Si noti che le tabelle del database si aprono con open
sono disponibili utilizzando main.tableName
, a qualsiasi database collegato può essere assegnato qualsiasi nome (otherDb
nell'esempio sopra).
Altri suggerimenti
È possibile aprire più database contemporaneamente in Sqlite, ma è dubbio che sia possibile farlo quando si lavora da Flex/AIR.Nel client della riga di comando che esegui ATTACH DATABASE path/to/other.db AS otherDb
e quindi puoi fare riferimento alle tabelle in quel database come otherDb.tableName
proprio come in MySQL o SQL Server.
È possibile fare riferimento alle tabelle in un database collegato utilizzando la sintassi nome-database.nome-tabella.
questo codice può funzionare, scrive di me:
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;
}
}