Utiliser plusieurs bases de données SQLite à la fois
-
08-06-2019 - |
Question
J'ai 2 bases de données SQLite, une téléchargée depuis un serveur (server.db
), et un utilisé comme stockage sur le client (client.db
).Je dois effectuer diverses requêtes de synchronisation sur la base de données client, en utilisant les données de la base de données du serveur.
Par exemple, je souhaite supprimer toutes les lignes du client.db tRole
table et repeupler avec toutes les lignes du server.db tRole
tableau.
Autre exemple, je souhaite supprimer toutes les lignes du client.db tFile
table où le fileID
n'est pas dans le server.db tFile
tableau.
Dans SQL Server, vous pouvez simplement préfixer la table avec le nom de la base de données.Existe-t-il un moyen de le faire dans SQLite en utilisant Adobe Air ?
La solution
Je viens de regarder l'API AIR SQL, et il y a un attach
méthode sur SQLConnection
cela ressemble exactement à ce dont vous avez besoin.
Je n'ai pas testé cela, mais d'après la documentation cela devrait fonctionner :
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();
Il peut y avoir des erreurs dans cet extrait de code, je n'ai pas beaucoup travaillé avec l'API AIR SQL ces derniers temps.Notez que les tables de la base de données ouvertes avec open
sont disponibles en utilisant main.tableName
, n'importe quelle base de données attachée peut recevoir n'importe quel nom (otherDb
dans l'exemple ci-dessus).
Autres conseils
Il est possible d'ouvrir plusieurs bases de données à la fois dans SQLite, mais il est douteux que cela soit possible lorsque l'on travaille à partir de Flex/AIR.Dans le client de ligne de commande que vous exécutez ATTACH DATABASE path/to/other.db AS otherDb
et ensuite vous pouvez faire référence aux tables de cette base de données comme otherDb.tableName
tout comme dans MySQL ou SQL Server.
Les tables d'une base de données attachée peuvent être référencées à l'aide de la syntaxe nom-base-de-données.nom-table.
JOINDRE la documentation de la BASE DE DONNÉES sur sqlite.org
ce code peut fonctionner, il est écrit de moi :
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;
}
}