2008-08-05 102 views
7

我有2個SQLite數據庫,一個從服務器(server.db)下載,一個用作客戶端存儲(client.db)。我需要使用來自服務器數據庫的數據在客戶端數據庫上執行各種同步查詢。一次使用多個SQLite數據庫

例如,我想要刪除client.db tRole表中的所有行,並使用server.db tRole表中的所有行重新填充。

另一個例子,我想刪除client.db tFile表中的所有行,其中fileID不在server.db tFile表中。

在SQL Server中,您可以在表格前添加數據庫的名稱。無論如何,在使用Adobe Air的SQLite中這樣做?

+0

「沒有辦法從數據庫級別做到這一點。」怎麼會這樣? SQLite有一個`attach`關鍵字,允許你連接另一個數據庫。 Theo的回答顯示Air似乎有相應的API調用。當你特意說「從數據庫級別」時,我是否有一些區別? – spaaarky21 2014-05-09 19:32:28

回答

7

我只是看着AIR SQL API,並有上SQLConnectionattach方法看起來正是你需要的。

我沒有測試過這一點,但根據文檔它應該工作:

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(); 

有可能是在該代碼snipplet的錯誤,我沒有太多的工作與AIR SQL API最近。請注意,使用main.tableName可以打開使用open打開的數據庫表,任何附加的數據庫都可以提供任何名稱(上述示例中的otherDb)。

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

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; 
    } 
}