Usando vários bancos de dados SQLite de uma só vez
-
08-06-2019 - |
Pergunta
Tenho 2 bancos de dados SQLite, um baixado de um servidor (server.db
) e um usado como armazenamento no cliente (client.db
).Preciso realizar diversas consultas de sincronização no banco de dados do cliente, usando dados do banco de dados do servidor.
Por exemplo, quero excluir todas as linhas do client.db tRole
tabela e preencha novamente com todas as linhas na server.db tRole
mesa.
Outro exemplo, quero excluir todas as linhas do client.db tFile
mesa onde o fileID
não está no server.db tFile
mesa.
No SQL Server você pode simplesmente prefixar a tabela com o nome do banco de dados.Existe alguma maneira de fazer isso no SQLite usando Adobe Air?
Solução
Acabei de dar uma olhada na API do AIR SQL e há uma attach
método ativado SQLConnection
parece exatamente o que você precisa.
Não testei isso, mas de acordo com a documentação deve 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();
Pode haver erros nesse trecho de código. Não tenho trabalhado muito com a API AIR SQL ultimamente.Observe que as tabelas do banco de dados abertas com open
estão disponíveis usando main.tableName
, qualquer banco de dados anexado pode receber qualquer nome (otherDb
no exemplo acima).
Outras dicas
É possível abrir vários bancos de dados ao mesmo tempo no Sqlite, mas é duvidoso que isso possa ser feito ao trabalhar no Flex/AIR.No cliente de linha de comando você executa ATTACH DATABASE path/to/other.db AS otherDb
e então você pode se referir às tabelas desse banco de dados como otherDb.tableName
assim como no MySQL ou SQL Server.
As tabelas em um banco de dados anexado podem ser referenciadas usando a sintaxe nome-do-banco de dados.nome-da-tabela.
este código pode funcionar, é escrito por mim:
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;
}
}