actionscript 3 - Utilisation de plusieurs bases de données SQLite à la fois

Translate

J'ai 2 bases de données SQLite, une téléchargée depuis un serveur (server.db), et une utilisée comme stockage sur le client (client.db). Je dois effectuer diverses requêtes de synchronisation sur la base de données client, en utilisant les données de la base de données du serveur.

Par exemple, je souhaite supprimer toutes les lignes duclient.db tRoletable et remplissez à nouveau avec toutes les lignes duserver.db tRoletable.

Autre exemple, je souhaite supprimer toutes les lignes de laclient.db tFiletable où lefileIDn'est pas dans leserver.db tFiletable.

Dans SQL Server, vous pouvez simplement préfixer la table avec le nom de la base de données. Est-il possible de faire cela dans SQLite en utilisant Adobe Air?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Je viens de regarder l'API AIR SQL, et il y a unattachméthode surSQLConnectionil ressemble exactement à ce dont vous avez besoin.

Je n'ai pas testé cela, mais selon la documentation, cela devrait fonctionner:

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

Il peut y avoir des erreurs dans cet extrait de code, je n'ai pas beaucoup travaillé avec l'API AIR SQL ces derniers temps. Notez que les tables de la base de données ouvertes avecopensont disponibles en utilisantmain.tableName, toute base de données attachée peut recevoir n'importe quel nom (otherDbdans l'exemple ci-dessus).

La source
Translate

Il est possible d'ouvrir plusieurs bases de données à la fois dans Sqlite, mais il est douteux que cela puisse être fait lorsque vous travaillez à partir de Flex / AIR. Dans le client de ligne de commande que vous exécutezATTACH DATABASE path/to/other.db AS otherDbpuis vous pouvez faire référence aux tables de cette base de données commeotherDb.tableNamecomme dans MySQL ou SQL Server.

Les tables d'une base de données attachée peuvent être référencées à l'aide de la syntaxe nom-base-de-données.nom-table.

Documentation ATTACH DATABASE sur sqlite.org

La source
James Lee
Translate

ce code peut être du travail, c'est écrit de moi:

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