Flex本地SQLite BLOB显示

时间:2011-07-29 20:28:35

标签: flex sqlite air blob

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

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

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

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

在这个网站上,我发现一些Adobe Air的参考资料在读取blob时会寻找额外的字节信息,因为它们具有不同的语法来写入程序中创建的数据库。请参阅:What is the first bytes in a Blob column SQlite Adobe AIR? Blob Sizeinfo?

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

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

1 个答案:

答案 0 :(得分:2)

插入代码:

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


  

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

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