【问题标题】:Flex local SQLite BLOB displayFlex 本地 SQLite BLOB 显示
【发布时间】:2011-07-29 20:28:35
【问题描述】:

我正在从 Flash Builder 4.5 构建一个应用程序。我是 SQLite 的新手,这就是我的问题所在!

我在使用 Firefox 方便的 SQLite 管理器构建的 SQLite 数据库中有 3 列。因此,我创建了 3 列,一个索引/引用,它只是一个递增的 INTEGER 以便于参考,一个 TEXT 中图像的描述性标题(以便以后可以搜索),以及一个保存 png 的 BLOB 类型。

我正在尝试将其添加到我的项目中的资产文件夹中(作为预填充的数据库),并一次一个地在一个窗口中显示 blob 图像,用户可以滚动。这是我遇到问题的地方。最终我希望能够对其进行加密并添加一个搜索工具,但首先要做的是显示图像。

我花了几个小时在网上搜索这个主题,但没有太多帮助:Adobe 提供了有关使用 SQLite 和 AS3 的提示(他们的参考文档和他们网站的支持部分有一些概述文章)但是没有什么是指深入读取 blob 数据。

在这个站点上,我发现了一些关于 Adob​​e Air 在读取 blob 时寻找额外字节信息的引用,因为它们具有不同的语法来写入程序中创建的数据库。见:What is the first bytes in a Blob column SQlite Adobe AIR? Blob Sizeinfo?

有人提到需要在 SELECT 语句中使用 CAST 来使用不是由 AIR 创建的 dbs,但 adobe 的网站在他们的文档中没有关于此的任何信息。

无论如何,我有点啰嗦,但我有点不知所措 - 非常感谢任何帮助/见解。

【问题讨论】:

  • 我愿意提供的任何额外信息。带有一些示例代码或任何额外信息的网站会很棒!

标签: apache-flex sqlite air blob


【解决方案1】:

插入代码:

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 数据,因此最好在代码中填充数据库。


这是否意味着我需要将图像放在资产文件夹(或远程服务器等)中才能填充数据库?

图像可以是本地的或远程的。您只需要能够将它们加载到字节数组中进行存储。但是,如果您可以选择单独的图像存储库,最好存储图像的链接/路径,而不是将二进制数据存储在数据库中。

【讨论】:

  • 感谢 jBit 的回复!由于我是 SQL 新手,请稍等片刻。我没有在应用程序的资产/资源文件夹中看到对我的数据库的引用。我是否必须从代码中构建它?这是否意味着我需要将图像放在资产文件夹(或远程服务器等)中才能填充数据库?我也不需要在我的应用程序中更改或修改它,我只需要能够调用数据进行显示。然后搜索它。感谢您的帮助。
  • 如果使用 SQLite 管理器创建将在 AIR 中使用的数据库,则在定义列时,请务必在指定 INT 列类型时使用 INTEGER(确切地说是 I-N-T-E-G-E-R)。 stackoverflow.com/questions/6622582/…
  • 非常感谢 jBit,这正是我想要的。很好的答案,我相信它也会帮助其他新手。感谢蒂姆提供的额外信息,我敢肯定这会省去一些麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2019-11-17
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多