当尝试选择BLOB类型的列时,SQLStatement抛出RangeError#2006:提供的索引超出范围

时间:2010-08-30 19:09:36

标签: actionscript-3 sqlite air blob

var imageData:ByteArray = new ByteArray();
var headshotStatement:SQLStatement = new SQLStatement();
headshotStatement.sqlConnection = dbConnection;
var headshotStr:String = "SELECT headshot FROM ac_images WHERE id = " + idx;
headshotStatement.text = headshotStr;
headshotStatement.execute();

错误引用此块中的最后一行。我在网上找到了一些参考文献,其中人们无法使用已从外部程序插入数据的AS3选择BLOB,这是我的确切情况。

确切的错误跟踪是:

RangeError: Error #2006: The supplied index is out of bounds.
at flash.data::SQLStatement/internalExecute()
at flash.data::SQLStatement/execute()
at edu.bu::DataManager/getHeadshotImageData()[omitted/DataManager.as:396]
at edu.bu::CustomStudentProfileEditorWindow/editStudent()[omitted/CustomStudentProfileEditorWindow.mxml:194]
at edu.bu::CustomStudentProfileEditorWindow/profileEditor_completeHandler()[omitted/CustomStudentProfileEditorWindow.mxml:37]
at edu.bu::CustomStudentProfileEditorWindow/___CustomStudentProfileEditorWindow_Window1_creationComplete()[omitted/CustomStudentProfileEditorWindow.mxml:9]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:12528]
at mx.core::UIComponent/set initialized()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:1627]
at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:759]
at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1072]

任何想法导致AS3窒息的数据可能出错?

编辑:我尝试使用SQLite Manager 3.5 for OS X将相同的数据插入到二进制类型字段中,结果相同。我正在使用JPG,尝试其他图像格式,虽然我不能开始猜测哪个提供的索引超出界限,因为尝试跳转到定义只是表明它是从SWC获得它我可以不明白。在我用拉链分发数据并在运行中解压缩之前抓住吸管,这是我不想做的。

编辑2,解决方法版本:目前,我已经编写了一个快速MXML窗口,提示您输入图像并将数据插入数据库。仍然想知道为什么另一个应用程序无法以SQLStatement理解的方式存储BLOB数据。我实际上是设置了几个按钮,提示我们在数据库中找到我想要的图像的文件路径,用readBytes()读取它们到ByteArray,然后使用SQLStatement将它存储到SQLite数据库中。然后我可以毫不费力地读回图像。

编辑3:以下是表格结构的图像。注意,当我有Flash执行数据库图像插入时,这个相同的表正在成功使用,而不是其他一些工具,它将数据正确地存储在BLOB字段中,而不是Flash ...

Table

3 个答案:

答案 0 :(得分:3)

从Air docs开始,支持CAST从Air 2.5引入非AMF blob。我在python中创建并在Air中使用的数据库/ blob字段遇到了同样的问题,这为我解决了这个问题。

来自docs的例子:

stmt.text = "SELECT CAST(data AS ByteArray) AS data FROM pictures;"; 
stmt.execute(); 
var result:SQLResult = stmt.getResult(); 
var bytes:ByteArray = result.data[0].data;

http://help.adobe.com/en_US/as3/dev/WSd47bd22bdd97276f1365b8c112629d7c47c-8000.html

答案 1 :(得分:2)

我找到了你的问题,因为我遇到了同样的问题。

我终于能够解决并解决我的问题,也许你应该看看我的解决方案也许这可以帮助你解决你的问题:What is the first bytes in a Blob column SQlite Adobe AIR? Blob Sizeinfo?

Adob​​e AIR和AMF(ActionScript消息格式)的所有错误都试图将ByteArray对象存储为格式化二进制文件。所以它添加了第一个字节12,它是ByteArray的TypeCode,后跟一个int-29整数,用于size-length,最后是原始数据。

因此,如果要将二进制blob数据存储到必须由Adobe AIR读取的sqlite中,则必须添加这些信息以允许Adobe Air将所有内容转换回ByteArray。

答案 2 :(得分:0)

感谢您的提示,我解释了如何在此线程中使用Java编写AMF字节: What is the first bytes in a Blob column SQlite Adobe AIR? Blob Sizeinfo?

希望这有帮助,

法比安