複数の SQLite データベースを同時に使用する
-
08-06-2019 - |
質問
SQLite データベースが 2 つあり、1 つはサーバーからダウンロードされました (server.db
)、もう 1 つはクライアント上のストレージとして使用されます (client.db
)。サーバー データベースのデータを使用して、クライアント データベースでさまざまな同期クエリを実行する必要があります。
たとえば、次の行をすべて削除したいとします。 client.db tRole
テーブルにすべての行を再入力します。 server.db tRole
テーブル。
別の例として、 client.db tFile
テーブル fileID
には入っていない server.db tFile
テーブル。
SQL Server では、テーブルの先頭にデータベース名を付けるだけで済みます。とにかく、Adobe Airを使用してSQLiteでこれを行うことはできますか?
解決
AIR SQL API を調べてみたところ、 attach
メソッドオン SQLConnection
まさに必要なものに見えます。
私はこれをテストしていませんが、ドキュメントによると、うまくいくはずです。
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();
そのコード スニプレットにはエラーがある可能性があります。私は最近 AIR SQL API をあまり使っていません。データベースのテーブルが次のように開かれたことに注目してください。 open
を使用して利用できます main.tableName
, 、接続されたデータベースには任意の名前を付けることができます (otherDb
上の例では)。
他のヒント
Sqlite では複数のデータベースを同時に開くことができますが、Flex/AIR から作業するときにそれができるかどうかは疑問です。実行するコマンドラインクライアントで ATTACH DATABASE path/to/other.db AS otherDb
そして、そのデータベース内のテーブルを次のように参照できます。 otherDb.tableName
MySQL や SQL Server と同じように。
接続されたデータベース内のテーブルは、database-name.table-name という構文を使用して参照できます。
このコードは機能する可能性がありますが、これは私のことを書いたものです:
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;
}
}