У меня есть 2 базы данных SQLite, одна загружена с сервера ( server.db
), а другая используется в качестве хранилища на клиенте ( client.db
). Мне нужно выполнить различные запросы синхронизации к базе данных клиента, используя данные из базы данных сервера.
Например, я хочу удалить все строки в client.db tRole
таблице и снова заполнить все строки в server.db tRole
таблице.
Другой пример, я хочу удалить все строки в client.db tFile
таблице, которых fileID
нет в server.db tFile
таблице.
В SQL Server вы можете просто поставить таблицу перед именем базы данных. Есть ли способ сделать это в SQLite с помощью Adobe Air?
Я только что посмотрел на API AIR SQL, и там есть 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();
В этом фрагменте кода могут быть ошибки, в последнее время я мало работал с API-интерфейсом AIR SQL. Обратите внимание, что таблицы базы данных, открываемой с open
помощью main.tableName
, доступны с использованием , любой присоединенной базе данных может быть присвоено любое имя ( otherDb
в приведенном выше примере).
Можно одновременно открыть несколько баз данных в Sqlite, но вряд ли это удастся сделать при работе с Flex / AIR. В клиенте командной строки вы запускаете ATTACH DATABASE path/to/other.db AS otherDb
и затем можете ссылаться на таблицы в этой базе данных так otherDb.tableName
же, как в MySQL или SQL Server.
На таблицы в присоединенной базе данных можно ссылаться с использованием синтаксиса database-name.table-name.
этот код может работать, это написать мне:
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;
}
}
attach
ключевое слово, которое позволяет вам присоединить другую базу данных. И ответ Тео показывает, что Air, кажется, имеет соответствующий вызов API. Есть ли какое-то различие, которое я пропускаю, когда вы специально говорите «на уровне базы данных»?