无法使用sql.js读取blob类型的sqlite3数据库列

时间:2014-05-20 08:25:10

标签: sqlite blob javascript emscripten

所以我使用sql.js库,即javascript中的sqlite端口,可以在https://github.com/kripken/sql.js找到。

这是我打开并读取本地平面文件存储数据库的代码。

首先通过此HTML

选择文件本地文件
<input type="file" id="input" onchange="handleFiles(this.files)">

幕后的js代码如下,

function handleFiles(files) {   
  var file = files[0]; 
  var reader = new FileReader();
  reader.readAsBinaryString(file);
  openDbOnFileLoad(reader); 
  function openDbOnFileLoad(reader){
    setTimeout(function () {
    if(reader.readyState == reader.DONE) {
      //console.log(reader.result);
      db = SQL.open(bin2Array(reader.result));
      execute("SELECT * FROM table");
    } else {
      //console.log("Waiting for loading...");
      openDbOnFileLoad(reader);
    }
    }, 500);    
  }

}

function execute(commands) {
  commands = commands.replace(/\n/g, '; ');
  try {
    var data = db.exec(commands);
    console.log(data);
  } catch(e) {
    console.log(e);
  }
}
function bin2Array(bin) {
  'use strict';
  var i, size = bin.length, ary = [];
  for (i = 0; i < size; i++) {
      ary.push(bin.charCodeAt(i) & 0xFF);
  }
  return ary;
}

现在这个工作,我可以访问数据库中的所有列和值,但是有一个类型为blob的列,它只显示为空。关于我如何访问这个blob内容的任何想法?

正确答案!

所以我在这个问题中试图问的是如何使用sql.js读取blob类型列的内容。正确的答案是在问题中指定列名,对于包含blob类型数据的列,使用十六进制函数获取其内容,即从表中选择column1,hex(column2)。对于最有效的方法来说,这绝不是一个问题。我还写了blog post这个。

2 个答案:

答案 0 :(得分:0)

这是一个稍微修改过的函数副本,负责初始化我的sqlite数据库:

sqlite.prototype._initQueryDb = function(file, callback) {
    self = this;
    var reader = new FileReader();

    // Fires when the file blob is done loading to memory.
    reader.onload = function(event) {
        var arrayBuffer = event.target.result,
            eightBitArray = new Uint8Array(arrayBuffer),
            database = SQL.open(eightBitArray);
        self._queryDb = database;

        // Trigger the callback to the calling function
        callback();
    }

    // Start reading the file blob.
    reader.readAsArrayBuffer(file);
}

在这种情况下,file是我从HTML输入元素获取的本地sqlite数据库句柄。我指定一个函数在更改事件发生在该输入时调用,并从生成的event.target.files[0]对象中获取blob。

为了我的简洁,我留下了一些东西,但如果你还在努力,我可以把一个更小更简单的例子放在一起。

答案 1 :(得分:0)

答案是:用kripken的sql.js,你上面提到的你不能。至少截至今天(2014年5月)。 原作者不再维护 sql.js

但是,我是sql.js的一个fork的作者,可以在这里找到:https://github.com/lovasoa/sql.js

此fork带来了一些改进,包括对预准备语句的支持,与原始版本相反,值在自然javascript类型中处理,而不仅仅作为字符串。

使用此版本,可以处理BLOB (用于读取和写入),它们显示为 Uint8Arrays (您可以将其转换为对象URL以显示内容给你的用户)。

以下是如何从数据库中读取blob数据的示例:

var db = new SQL.Database(eightBitArray); // eightBitArray can be an Uint8Array
var stmt = db.prepare("SELECT blob_column FROM your_table");

while (stmt.step()) { // Executed once for every row of result
  var my_blob = stmt.get()[0]; // Get the first column of result
  //my_blob is now an Uint8Array, do whatever you want with it
}
db.close(); // Free the memory used by the database

您可以在此处查看完整文档:http://lovasoa.github.io/sql.js/documentation/