Pergunta

Tenho 2 bancos de dados SQLite, um baixado de um servidor (server.db) e um usado como armazenamento no cliente (client.db).Preciso realizar diversas consultas de sincronização no banco de dados do cliente, usando dados do banco de dados do servidor.

Por exemplo, quero excluir todas as linhas do client.db tRole tabela e preencha novamente com todas as linhas na server.db tRole mesa.

Outro exemplo, quero excluir todas as linhas do client.db tFile mesa onde o fileID não está no server.db tFile mesa.

No SQL Server você pode simplesmente prefixar a tabela com o nome do banco de dados.Existe alguma maneira de fazer isso no SQLite usando Adobe Air?

Foi útil?

Solução

Acabei de dar uma olhada na API do AIR SQL e há uma attach método ativado SQLConnection parece exatamente o que você precisa.

Não testei isso, mas de acordo com a documentação deve funcionar:

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

Pode haver erros nesse trecho de código. Não tenho trabalhado muito com a API AIR SQL ultimamente.Observe que as tabelas do banco de dados abertas com open estão disponíveis usando main.tableName, qualquer banco de dados anexado pode receber qualquer nome (otherDb no exemplo acima).

Outras dicas

É possível abrir vários bancos de dados ao mesmo tempo no Sqlite, mas é duvidoso que isso possa ser feito ao trabalhar no Flex/AIR.No cliente de linha de comando você executa ATTACH DATABASE path/to/other.db AS otherDb e então você pode se referir às tabelas desse banco de dados como otherDb.tableName assim como no MySQL ou SQL Server.

As tabelas em um banco de dados anexado podem ser referenciadas usando a sintaxe nome-do-banco de dados.nome-da-tabela.

ANEXAR documentação do DATABASE em sqlite.org

este código pode funcionar, é escrito por mim:

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;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top