9

我有 2 个 SQLite 数据库,一个从服务器下载 ( server.db),一个用作客户端的存储 ( client.db)。我需要使用服务器数据库中的数据对客户端数据库执行各种同步查询。

例如,我想删除表中的所有行client.db tRole,并重新填充表中的所有行server.db tRole

另一个例子,我想删除client.db tFile表中fileID不在表中的所有行server.db tFile

在 SQL Server 中,您只需在表前加上数据库名称即可。无论如何使用 Adob​​e 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

可以使用语法 database-name.table-name 来引用附加数据库中的表。

在 sqlite.org 上附加数据库文档

于 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 回答