1, 通常的操作方式:
首先我们建立表:CREATE TABLE "pages" ("id" varchar, "data" blob),然后了使用sql 语句。
sql = "SELECT id, CAST(data AS ByteArray) AS data FROM pages"
flex 的代码如下:
sql = "SELECT id, CAST(data AS ByteArray) AS data FROM pages"
1 SQLConnection connection = new SQLConnection(); 2 var file:File = File.applicationDirectory.resolvePath("assetsdbdata.db"); 3 connection.open(file); 4 5 var state:SQLStatement = new SQLStatement(); 6 state.text = sql; 7 state.sqlConnection = connection 8 state.execute(); 9 10 var result:SQLResult = state.getResult(); 11 var rows:int = result.data.length; 12 for(var i:int =0; i < rows; i++) 13 { 14 15 var row:Object = result.data[i]; 16 var data:ByteArray = row[data]; 17 }
2, 特殊的处理方式:
但是了,问题出现了,CAST(data AS ByteArray) AS data 这句,有时候,这个死活转不成bytearray,一直是0。这个问题困扰了我很久,我到adobe官网也查了半天,没有结果,最后找到sqlite 的 hex 函数。即改变sql 语句 SELECT id, hex(data) AS data FROM pages。
Hex 函数,其实就是把sqlite blob 类型的数据转换为字符串,具体怎么转了,比如是:55ffab这样。 其实每个字符是4个字节, 那55 就表示一个Byte 了,即8字节。所以了,我写两个函数,用来转换hex 为bytearray。
private function Hex2ByteArrayNew(hexStr:String):ByteArray { var ret:ByteArray = new ByteArray(); var leng:int = hexStr.length; var newHexArrStr:String = ""; var step:int = 2; var i:int = 0; while(i<leng) { try { //2 位一个byte var tempI:int = parseInt(hexStr.substr(i,step),16); ret.writeByte(tempI); i += step; }catch(e:Error) { trace(e); } } return ret; }
3, Bytearray 处理的一些技巧
(1) 刚开始读取的时候,必须设置position = 0。
(2) readUnsignedByte, 以及 readDouble ,这些是读取固定字节,转换成相应的数据类型。一般使用这些方法来读取。