質問

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 という構文を使用して参照できます。

ATTACH DATABASE のドキュメント (sqlite.org)

このコードは機能する可能性がありますが、これは私のことを書いたものです:

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;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top