所以我使用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这个。
答案 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/