9

2 つの SQLite データベースがあり、1 つはサーバーからダウンロードされ ( server.db)、もう 1 つはクライアントのストレージとして使用されます ( client.db)。サーバー データベースのデータを使用して、クライアント データベースでさまざまな同期クエリを実行する必要があります。

たとえば、テーブル内のすべての行を削除し、client.db tRoleテーブル内のすべての行を再入力したいとしserver.db tRoleます。

client.db tFile別の例として、テーブルにfileIDない行をすべて削除したいとしserver.db tFileます。

SQL Server では、テーブルの前にデータベースの名前を付けることができます。Adobe Airを使用してSQLiteでこれを行う方法はありますか?

4

3 に答える 3

7

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上記の例)。

于 2008-08-13T16:16:12.450 に答える
3

SQLiteで一度に複数のデータベースを開くことは可能ですが、Flex/AIRから作業するときにそれができるかどうかは疑わしいです。コマンドラインクライアントで実行すると、MySQLやSQL Serverの場合と同じようにATTACH DATABASE path/to/other.db AS otherDb、そのデータベース内のテーブルを参照できます。otherDb.tableName

アタッチされたデータベース内のテーブルは、構文data​​base-name.table-nameを使用して参照できます。

sqlite.orgのATTACHDATABASEドキュメント

于 2008-08-12T12:55:01.623 に答える
0

このコードは機能する可能性があります。それは私の書き込みです:

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;
    }
}
于 2008-12-15T16:46:43.463 に答える