一次使用多个 SQLite 数据库
Posted
技术标签:
【中文标题】一次使用多个 SQLite 数据库【英文标题】:Using multiple SQLite databases at once 【发布时间】:2010-09-05 09:00:50 【问题描述】:我有 2 个 SQLite 数据库,一个从服务器下载 (server.db
),一个用作客户端的存储 (client.db
)。我需要使用服务器数据库中的数据对客户端数据库执行各种同步查询。
例如,我想删除client.db tRole
表中的所有行,并用server.db tRole
表中的所有行重新填充。
另一个例子,我想删除client.db tFile
表中fileID
不在server.db tFile
表中的所有行。
在 SQL Server 中,您只需在表前加上数据库名称即可。无论如何在使用 Adobe Air 的 SQLite 中执行此操作?
【问题讨论】:
"从数据库级别无法做到这一点。"为何如此? SQLite 有一个attach
关键字,允许您附加另一个数据库。而 Theo 的回答表明 Air 似乎有相应的 API 调用。当您特别说“从数据库级别”时,我是否遗漏了一些区别?
【参考方案1】:
在 SQLite 中一次打开多个数据库是可能的,但在 Flex/AIR 中是否可以完成则值得怀疑。在命令行客户端中运行 ATTACH DATABASE path/to/other.db AS otherDb
,然后您可以将该数据库中的表称为 otherDb.tableName
,就像在 mysql 或 SQL Server 中一样。
可以使用语法 database-name.table-name 来引用附加数据库中的表。
ATTACH DATABASE documentation at sqlite.org
【讨论】:
【参考方案2】:我刚刚查看了 AIR SQL API,SQLConnection
上有一个 attach
方法,看起来正是您需要的。
我没有对此进行测试,但根据文档它应该可以工作:
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();
该代码 sn-p 中可能存在错误,我最近使用 AIR SQL API 的工作不多。请注意,使用open
打开的数据库的表可以使用main.tableName
获得,任何附加的数据库都可以被赋予任何名称(上例中的otherDb
)。
【讨论】:
【参考方案3】:这段代码可以工作,是我写的:
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;
【讨论】:
以上是关于一次使用多个 SQLite 数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQLObject 将数据从一个 sqlite 数据库迁移到多个 SQLite 数据库