代码改变世界

flex sqlite 操作blog 二进制数据

2013-10-02 19:49  c#在路上  阅读(1037)  评论(0编辑  收藏  举报

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("assets\db\data.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 ,这些是读取固定字节,转换成相应的数据类型。一般使用这些方法来读取。