一次使用多个 SQLite 数据库
-
08-06-2019 - |
题
我有 2 个 SQLite 数据库,一个是从服务器下载的(server.db
),一个用作客户端的存储(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;
}
}
不隶属于 StackOverflow