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