Сведения о вопросе

krutoi

16:03, 1st July, 2020

Теги

actionscript-3   flex   sqlite   air   adobe    

Использование нескольких баз данных SQLite одновременно

Просмотров: 543   Ответов: 3

У меня есть 2 базы данных SQLite, одна загружена с сервера (server.db), а другая используется в качестве хранилища на клиенте ( client.db). Мне нужно выполнить различные запросы синхронизации в клиентской базе данных, используя данные из базы данных сервера.

Например, я хочу удалить все строки в таблице client.db tRole и повторно заполнить все строки в таблице server.db tRole .

Другой пример: я хочу удалить все строки в таблице client.db tFile , где fileID не находится в таблице server.db tFile .

В SQL Server вы можете просто префиксировать таблицу с именем базы данных. Есть ли вообще возможность сделать это в SQLite, используя Adobe Air?



  Сведения об ответе

padenie

18:03, 1st July, 2020

Я только что посмотрел на AIR SQL API, и там есть метод attach на SQLConnection , он выглядит именно так, как вам нужно.

Я не проверял это, но согласно документации это должно работать:

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

В этом фрагменте кода могут быть ошибки, в последнее время я мало работал с AIR SQL API. Обратите внимание , что таблицы базы данных, открытые с помощью open , доступны с помощью main.tableName, любой присоединенной базе данных может быть присвоено любое имя вообще ( otherDb в приведенном выше примере).


  Сведения об ответе

fo_I_K

18:03, 1st July, 2020

В Sqlite можно открыть сразу несколько баз данных, но вряд ли это можно сделать при работе с Flex/AIR. в клиенте командной строки, который вы запускаете ATTACH DATABASE path/to/other.db AS otherDb , а затем вы можете ссылаться на таблицы в этой базе данных как на otherDb.tableName , так же как и на MySQL или SQL сервере.

Столы в прикрепленной базы данных может быть передан с использованием базы данных name.table-name синтаксис.

Прикрепите документацию базы данных по адресу sqlite.org


  Сведения об ответе

$DOLLAR

18:03, 1st July, 2020

этот код может быть работой,он написан мной:

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться