AS3 AIR应用:本地SQL数据库存储数组失败问题求助
解决AIR应用中Local SQL Database存储/读取数组的问题
嘿,这个坑我当初做AIR表单应用的时候也踩过!你遇到的错误核心原因很明确:直接把数组对象存入text类型字段时,Flash会自动调用对象的toString()方法,最终存进数据库的只是[object Object]这个毫无意义的字符串,而不是数组的实际数据——这就导致你读取时根本没法把这个字符串转回数组。
下面给你两种靠谱的解决思路,都是通过「序列化-反序列化」来处理数组:
方法一:用JSON序列化(推荐,轻量易维护)
这是最常用的方案,把数组转成JSON格式的字符串存入数据库,读取时再解析回数组。Flash Builder 4.6的AIR环境自带JSON工具类,不用额外引入库:
存储数组时:
import flash.utils.JSON; // 假设你的目标数组是formReportArray var arrayToStore:String = JSON.stringify(formReportArray); // 接下来把arrayToStore存入Local SQL的text字段即可
读取数组时:
import flash.utils.JSON; // 从数据库读取到的字符串 var storedString:String = yourDatabaseQueryResult; // 解析回数组 var restoredArray:Array = JSON.parse(storedString) as Array;
⚠️ 注意:如果数组里包含自定义对象,要确保这些对象是可JSON序列化的(没有循环引用、属性都是基本类型或可序列化对象),否则JSON.stringify会抛出错误。
方法二:用ByteArray序列化(适合复杂对象/数组)
如果你的数组里有复杂的自定义对象,JSON序列化搞不定的话,可以用ByteArray转成Base64字符串存储:
存储数组时:
import flash.utils.ByteArray; import mx.utils.Base64Encoder; var byteArray:ByteArray = new ByteArray(); byteArray.writeObject(formReportArray); byteArray.position = 0; // 转成Base64字符串 var encoder:Base64Encoder = new Base64Encoder(); encoder.encodeBytes(byteArray); var base64String:String = encoder.toString(); // 把base64String存入text字段
读取数组时:
import flash.utils.ByteArray; import mx.utils.Base64Decoder; var storedBase64:String = yourDatabaseQueryResult; var decoder:Base64Decoder = new Base64Decoder(); decoder.decode(storedBase64); var byteArray:ByteArray = new ByteArray(); byteArray.writeBytes(decoder.toByteArray()); byteArray.position = 0; // 读取回数组 var restoredArray:Array = byteArray.readObject() as Array;
额外排查点
- 确认你存储的时候没有直接把数组对象传给SQL语句,一定要先转成字符串再存入text字段;
- 读取后可以先
trace(storedString)看看内容,如果输出是[object Object],那说明你之前的存储逻辑确实没做序列化,赶紧改成上面的方法就行。
内容的提问来源于stack exchange,提问作者MS JuGnu
相关产品推荐
相关产品推荐

