插入代码:
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 数据,因此最好在代码中填充数据库。
这是否意味着我需要将图像放在资产文件夹(或远程服务器等)中才能填充数据库?
图像可以是本地的或远程的。您只需要能够将它们加载到字节数组中进行存储。但是,如果您可以选择单独的图像存储库,最好存储图像的链接/路径,而不是将二进制数据存储在数据库中。