无剑网 Logo

无剑网

㊣Vio.Lam 的网络进化笔记.

AIR 在Sqlite数据库保存和读取图片

发布: 时间: 分类: RIA 研究

这两天解决了一个AIR的编程难题:在Sqlite数据库直接存取图片。对高手也许没什么,对我这样的AS3菜鸟还是非常吃力的。最后通过BitmapData编码成Base64,然后转换为ByteArray,最后再写进Sqlite的二进制字段,实现了保存。至于读取,则通过逆向操作实现。

据网上的介绍,原本是有两种模式的,一是我上面用的BitmapData编码保存,再解码读取。二是利用PNG/JPG的Encode,出来的是一个ByteArray结果,然后可以直接存进数据库;再利用Loader.loadBytes可以从ByteArray还原PNG、JPG、SWF等支持的格式。其中Loader的加载是需要一点时间的,也就是说最后读取图片结果需要监听它的Event.Complete事件。

但是,第二种方法的Loader.loadBytes方法,很奇怪的,不怎么稳定,操作十几个图片还行,如果同时load几十个图片以上,就会时好时坏。我用这种方法测试了同时加载150个图片,它顶多只能加载完成五六十个,其他的事件最后都没回音。换成单任务,一个完成后再继续另一个的方式,稍微好一点,但还是有问题。很古怪,有待高手指点。(08年12月备注:在某个地方看到,据说这个问题是由FlexBuilder编译器造成的,调试的时候有问题,如果换用其他IDE或者输出,则没问题。)于是只能采用第一种方法,也就是最开始上面提到的那种,其中ByteArray还有compress和uncompress的压缩命令,效果不错速度也挺快。我测试了大概500个图片,全部都能迅速完成。

另外,关于如何在Sqlite数据库里面插入二进制,一开始我也搞不懂,中文关于AIR的资料很少。主要还是用SQLStatement.parameters这个属性。稍为举例如下,

var dbstmt:SQLStatement = new SQLStatement();
var imgData:ByteArray = new ByteArray();
dbstmt.text = "INSERT INTO image_library (title,image) VALUES ('test picture',@img)";
dbstmt.parameters["@img"] = imgData;
dbstmt.execute();

Sqlite是非常精巧实用的数据库,有点像Access数据库又比Access好太多。PHP5默认支持的就是SQLite而不再是PHP + MySql这样的黄金组合了。PHP + SQLite的好处是无需额外配置MySql,传到空间后使用简直就像ASP+Access那么方便。SQLite能存储二进制即BLOB类型,有个老外居然在里面保存Youtube的FLV视频,它的好处可见一斑。

最后,我觉得选择哪种编程语言都不重要,最根本的还是人。所谓的迅捷开发,我认为不过是使用的人越多,资源和帮助就会越丰富,速度自然就快了嘿嘿。哪天我对这个项目动摇信心了,或者觉得累了,它就会马上死掉。人为的影响,比某种语言特性的影响要直接、严重。

收藏到书签:
  • quote   1. 衫人
  • http://www.wakao123.com
  • 请教博主一个小问题,我在air中用上面的方法进行图片插入的时候会提示
    SQLError: 'Error #3115: SQL Error.', details:''@img' parameter name(s) found in parameters property but not in the SQL specified.', operation:'execute'


  • 2008-12-2 19:29:14 
  • quote   2. violam
  • 晕我这里那句SQL的"test picture"什么时候变成双引号了,要改过来,正确的是'test picture',用单引号不是双引号。
    我的程序就是这样写的,运行得很好,不知道你的是什么原因。你确保imgData是ByteArray吗?实在不行的话,贴几行代码上来看看
    由 violam 于 2008-12-2 20:06:57 最后编辑
  • 2008-12-2 20:06:08 
  • quote   3. 衫人
  • http://www.wakao123.com
  • 呵呵,问题已经解决了,是dbstmt.parameters["@img"] = imgData;这句在执行"select * from ceil"的时候没有清空才有了上面的提示,谢了~~~
  • 2008-12-3 20:32:49 

Valid Code

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最近发表

分类标签

AIR 在Sqlite数据库保存和读取图片