Flex локальный SQLite BLOB-дисплей - PullRequest
0 голосов
/ 30 июля 2011

Я создаю приложение из Flash Builder 4.5.Я новичок в SQLite, и вот мои вопросы!

У меня есть 3 столбца в базе данных SQLite, которую я построил с помощью удобного менеджера SQLite в Firefox.Итак, я создал 3 столбца, индекс / ссылку, это просто инкрементный INTEGER для легкой ссылки, описательный заголовок изображения (чтобы его можно было искать позже) в тексте, и тип BLOB, содержащий pngs.

Я пытаюсь добавить это в папке ресурсов в свой проект (в качестве предварительно заполненной базы данных) и отображать изображения BLOB-объектов, по одному, в окне одно за другим, прокручивая пользователем,Здесь я сталкиваюсь с проблемами.В конце концов я хочу иметь возможность зашифровать его и добавить инструмент поиска, но обо всем по порядку, и это - отображение изображения.

Я потратил несколько часов на поиски в Интернете этой темы, но там не так много помощи: у Adobe есть советы по использованию SQLite с AS3 (их справочные документы и раздел поддержки на их веб-сайте имеют некоторый обзорстатьи), но ничто не относится к глубокому чтению данных BLOB.

На этом сайте я обнаружил некоторые ссылки на Adobe Air, который ищет дополнительную байтовую информацию при чтении больших двоичных объектов, поскольку они имеют другой синтаксис для записи в базы данных, созданные в программе.См .: Что такое первые байты в столбце BLOB-объектов SQlite Adobe AIR?Blob Sizeinfo?

Кто-то ссылался на необходимость использовать CAST в операторе SELECT для использования баз данных, не созданных AIR, но на веб-сайте Adobe нет никакой информации об этом в их документации.

В любом случае, я немного поболтал, но я немного ошеломлен - любая помощь / понимание очень ценится.

1 Ответ

2 голосов
/ 30 июля 2011

Введите код:

insertStatement = new SQLStatement();
insertStatement.sqlConnection = connection;
insertStatement.addEventListener(SQLEvent.RESULT, onInsertResult);
insertStatement.addEventListener(SQLErrorEvent.ERROR, onInsertError);
insertStatement.text = "INSERT INTO my_table (title, imagedata) VALUES (@titleString, @imageByteArray)";
insertStatement.parameters["@titleString"] = pngTitle; // String containing title
insertStatement.parameters["@imageByteArray"] = pngByteArray; // ByteArray containing image
insertStatement.execute();

Код получения:

selectStatement = new SQLStatement();
selectStatement.sqlConnection = connection;
selectStatement.addEventListener(SQLEvent.RESULT, onSelectResult);
selectStatement.addEventListener(SQLErrorEvent.ERROR, onSelectError);
selectStatement.text = "SELECT title, CAST(imagedata AS ByteArray) AS imagedata FROM my_table WHERE id = @recordId;"; 
selectStatement.parameters["@recordId"] = targetRecordId; // Id of target record
selectStatement.execute(); 

...

function onSelectResult(event:SQLEvent):void {
    selectStatement.removeEventListener(SQLEvent.RESULT, onSelectResult);
    var result:SQLResult = selectStatement.getResult();
    if (result.data != null) {
        var row:Object = result.data[0];
        var pngByteArray:ByteArray = result.data[0].imagedata;
        var pngTitle:String = result.data[0].title;
    }
}

Если у вас все еще есть проблемы, попробуйте также закодировать данные в base64 до вставки и аналогично декодировать из base64 после извлечения. Это добавит дополнительные 40% к размеру вставки данных в базу данных, но может помочь устранить проблемы при использовании двоичных данных с SQLite.

Последующие вопросы:

Я не увидел ссылку на свою базу данных в папке активов / ресурсов из приложения.

Если у вас была папка с именем assets в каталоге пакетов по умолчанию, и она содержала предварительно заполненный файл базы данных mydb.sqlite (например), вы можете открыть базу данных следующим образом:

var dbf:File = File.applicationDirectory.resolvePath("assets/mydb.sqlite");
var connection:SQLConnection = new SQLConnection();
connection.open(dbf);

Нужно ли строить его из кода как такового?

Вам не нужно создавать базу данных из кода - фактически я обычно использую SQLite Manager для создания баз данных SQLite. Однако, поскольку вы используете BLOB-данные, лучше всего заполнять базу данных кодом.


Значит ли это, что мне нужно хранить свои изображения в папке ресурсов (или на удаленном сервере и т. Д.), Чтобы заполнить базу данных?

Изображения могут быть локальными или удаленными. Вам просто нужно иметь возможность загружать их в байтовый массив для хранения. Но если у вас есть возможность отдельного репозитория изображений, было бы лучше хранить ссылки / пути к изображениям, а не хранить двоичные данные в базе данных.

...