Domanda

Ho 2 database SQLite, uno scaricato da un server (server.db) e uno utilizzato come storage sul client (client.db).Devo eseguire varie query di sincronizzazione sul database del client, utilizzando i dati del database del server.

Ad esempio, voglio eliminare tutte le righe nel file client.db tRole tabella e ripopolarla con tutte le righe nella tabella server.db tRole tavolo.

Un altro esempio, voglio eliminare tutte le righe nel file client.db tFile tabella dove il fileID non è nel server.db tFile tavolo.

In SQL Server puoi semplicemente anteporre alla tabella il nome del database.Esiste comunque la possibilità di farlo in SQLite utilizzando Adobe Air?

È stato utile?

Soluzione

Ho appena esaminato l'API AIR SQL e c'è un file attach metodo attivo SQLConnection sembra esattamente ciò di cui hai bisogno.

Non l'ho testato, ma secondo la documentazione dovrebbe funzionare:

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

Potrebbero esserci errori in quello snipplet di codice, ultimamente non ho lavorato molto con l'API AIR SQL.Si noti che le tabelle del database si aprono con open sono disponibili utilizzando main.tableName, a qualsiasi database collegato può essere assegnato qualsiasi nome (otherDb nell'esempio sopra).

Altri suggerimenti

È possibile aprire più database contemporaneamente in Sqlite, ma è dubbio che sia possibile farlo quando si lavora da Flex/AIR.Nel client della riga di comando che esegui ATTACH DATABASE path/to/other.db AS otherDb e quindi puoi fare riferimento alle tabelle in quel database come otherDb.tableName proprio come in MySQL o SQL Server.

È possibile fare riferimento alle tabelle in un database collegato utilizzando la sintassi nome-database.nome-tabella.

ALLEGARE la documentazione del DATABASE su sqlite.org

questo codice può funzionare, scrive di me:

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;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top