2008-08-05 26 views
7

Tôi có 2 cơ sở dữ liệu SQLite, một cơ sở dữ liệu được tải xuống từ máy chủ (server.db) và được sử dụng làm bộ nhớ trên máy khách (client.db). Tôi cần thực hiện các truy vấn đồng bộ hóa khác nhau trên cơ sở dữ liệu máy khách, sử dụng dữ liệu từ cơ sở dữ liệu máy chủ. Ví dụ: Tôi muốn xóa tất cả các hàng trong bảng client.db tRole và lặp lại với tất cả các hàng trong bảng server.db tRole.Sử dụng nhiều cơ sở dữ liệu SQLite cùng một lúc

Ví dụ khác, tôi muốn xóa tất cả các hàng trong bảng client.db tFile trong đó fileID không nằm trong bảng server.db tFile.

Trong SQL Server, bạn chỉ có thể đặt trước bảng với tên của cơ sở dữ liệu. Có anyway để làm điều này trong SQLite bằng cách sử dụng Adobe Air?

+0

Làm thế nào? SQLite có một từ khóa 'attach' cho phép bạn đính kèm một cơ sở dữ liệu khác. Và câu trả lời của Theo cho thấy Air dường như có một cuộc gọi API tương ứng. Có một số phân biệt tôi đang thiếu khi bạn cụ thể nói "từ cấp độ cơ sở dữ liệu"? – spaaarky21

Trả lời

7

Tôi chỉ nhìn API AIR SQL, và có một phương pháp attach trên SQLConnection có vẻ chính xác những gì bạn cần.

tôi đã không kiểm tra này, nhưng theo các tài liệu cần làm việc:

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

Có thể có sai sót trong mã snipplet, tôi chưa từng làm việc nhiều với các API AIR SQL thời gian gần đây. Lưu ý rằng các bảng của cơ sở dữ liệu được mở với open có sẵn bằng cách sử dụng main.tableName, bất kỳ cơ sở dữ liệu đính kèm nào cũng có thể được đặt tên bất kỳ (otherDb trong ví dụ trên).

1

Có thể mở nhiều cơ sở dữ liệu cùng một lúc trong Sqlite, nhưng chắc chắn nếu có thể được thực hiện khi làm việc từ Flex/AIR. Trong ứng dụng dòng lệnh bạn chạy ATTACH DATABASE path/to/other.db AS otherDb và sau đó bạn có thể tham chiếu đến các bảng trong cơ sở dữ liệu đó dưới dạng otherDb.tableName giống như trong MySQL hoặc SQL Server.

Các bảng trong cơ sở dữ liệu đính kèm có thể được tham chiếu bằng cách sử dụng tên cơ sở dữ liệu cú pháp-name.table.

ATTACH DATABASE documentation at sqlite.org

0

mã này có thể làm việc, đó là ghi của tôi: "Không có cách để làm điều này từ cấp cơ sở dữ liệu"

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; 
    } 
} 
Các vấn đề liên quan