【问题标题】:Storing byte array in HTML5 sqlite database在 HTML5 sqlite 数据库中存储字节数组
【发布时间】:2011-04-10 15:06:49
【问题描述】:

我正在开发一个支持离线的移动网络应用程序,需要在 HTML5 数据库中存储大量原始字节数据。我想尽可能紧凑地存储它们,因此不能选择连接字符串。这是一个示例代码,它创建一个数据库、表、插入数据并再次检索它。

例子:

var bytes=[97, 0, 6, 244, 98, 66, 76, 65, 131, 5, 7, 142, 81, 184, 112, 33];

openDatabase('_test_', 1.0, '_test-', 5000).transaction(function(tx) {
tx.executeSql("DROP TABLE IF EXISTS MYTABLE", [], function(){
tx.executeSql("CREATE TABLE IF NOT EXISTS MYTABLE(content BLOB);",[],function(){
tx.executeSql("INSERT INTO MYTABLE values(?)", [bytes], 
    function()
    {
        tx.executeSql("SELECT * FROM MYTABLE ", [], function(transaction, results)
        {
            console.log(results.rows.item(0))
        });
},function(transaction, error){console.log(error)})
},function(transaction, error){console.log(error)})
})
})

我正在尝试按原样存储数组,它实际上保存为连接字符串:"97, 0, 6, 244, 98, 66, 76, 65, 131, 5, 7, 142, 81, 184, 112、33"。不是我需要的,因为它太大了。

我现在正在将数组转换为字符串:

openDatabase('_test_', 1.0, '_test-', 5000).transaction(function(tx) {
tx.executeSql("DROP TABLE IF EXISTS MYTABLE", [], function(){
tx.executeSql("CREATE TABLE IF NOT EXISTS MYTABLE(content BLOB); ", [], function(){
tx.executeSql("INSERT INTO MYTABLE values(?)", [s], 
    function()
    {
        tx.executeSql("SELECT * FROM MYTABLE ", [], function(transaction, results)
        {
            console.log(results.rows.item(0))
        });
},function(transaction, error){console.log(error)})
},function(transaction, error){console.log(error)})
})
})

DB 现在返回的只是“a”。

所以我的问题是如何在不使用连接字符串的情况下序列化 HTML5 数据库中的 javascript 字节数组?

【问题讨论】:

  • 为什么你的数组中有`'0',这是一个空字符?
  • 数据只包含一个值为 0 的字节。有意义吗?

标签: javascript database sqlite html


【解决方案1】:

将数据转换为十六进制值并像这样插入:

INSERT INTO t2 VALUES(X'53514C697465');

BLOB 字面量是包含十六进制数据并以单个“x”或“X”字符开头的字符串字面量

Literal Values

【讨论】:

  • 对于应该容纳超过一个字节的 DB 列,我怎样才能做到这一点?我需要编码一个字节序列。
  • 所以对于 [97, 256, 6, 244, 98, 66, 76, 65, 131, 5, 7, 142, 81, 184, 112, 33] 我插入 X'611006F462424C4183578E51B87021'作为其十六进制表示。我不清楚如何将值从选择再次转换为原始 javascript 数组。你也可以在这里帮忙吗?
  • 假设 SQLite 返回一个看起来像 "611006F462424C4183578E51B87021" 的十六进制字符串,您可以每两个字符迭代一次,切片、parseInt 并推入一个数组。由于每两个字符代表一个字节,只需编写一个 for 循环,每次将索引增加 2 而不是 1。您可以通过 String.slice() 获取这两个字符,如下所示:hex.slice(ix, ix+2)。您可以通过parseInt(str, 16) 将它们转换为整数。所以它看起来像:arr = []; for(var ix = 0; ix < hex.length; ix = ix+2) { arr.push(parseInt(hex.slice(ix, ix+2), 16)); }
  • 这个答案在过去 8 年里没有被投票一次?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 2013-12-19
  • 2013-02-08
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多