1

有人可以提供一个不使用 node.js 加载现有 sqlite 数据库的简单完整示例。

假设 sql 数据库与 index.html 位于同一位置

例子:

我试过这个例子,但“内容”是未定义的。另外,我不知道如何访问“内容”中的数据?我真的可以用一个完整的例子。

var xhr = new XMLHttpRequest();
xhr.open('GET', '/path/to/database.sqlite', true);
xhr.responseType = 'arraybuffer';

xhr.onload = function(e) {
  var uInt8Array = new Uint8Array(this.response);
  var db = new SQL.Database(uInt8Array);
  var contents = db.exec("SELECT * FROM my_table");
  // contents is now [{columns:['col1','col2',...], values:[[first row], [second row], ...]}]
};
xhr.send();
4

1 回答 1

3

我知道这是旧的,但你去我的朋友。你就在那里,只是稍微调整了一下。我不确定你是否使用 GitHub 上的 SQL.js 库,但请这样做,因为它解决了许多浏览器安全问题,并使 SQL 方面的事情在大脑上更加容易。

如果您没有创建源或有一些 UTF 问题,则会引发异常。我在一个晚上写了这个,所以我没有运行超过几个函数,但我假设需要回调来防止异步过程中的 SQLite 问题。这是我第一次使用 SQLite 或 SQL.js 库,所以我还不知道。

重要的!这只是一个本地解决方案,它比高中更衣室更明显的漏洞。这绝不应该用于任何暴露在互联网上的东西。

这都是在我的类的顶部声明的,而不是在函数中。这是有目的的,因为我运行多个查询并且不希望在对象太大时加载/卸载对象的开销。

请注意源上的完全限定路径...相对路径对我不起作用。

var xhrLocal = new XMLHttpRequest();
xhrLocal.open('GET', 'http://localhost/mp3/data/media.sqlite', true);
xhrLocal.responseType = 'arraybuffer';

var localData;

xhrLocal.onload = function(e) {
  var uInt8Array = new Uint8Array(this.response);
  localData = new SQL.Database(uInt8Array);
};

xhrLocal.send();

此时,您已将数据库加载到名为 localData 的对象中,您可以从任何地方查询它。这是我为获取流派信息而编写的查询。

function FillGenreLists() {

    var sqlSel = 'SELECT * FROM GenreData';
    var data = localData.exec(sqlSel);

    var output = [];
    $.each(data[0].values, function(key, value)
    {
        output.push('<option value="'+ value[0] +'">'+ value[1] +'</option>');
    });

    $('#selGenres').html(output.join(''));
}

SQL 调用的输出通常是一个数组数组,不用担心改变它,只需将 SQL 调用的结果输出到控制台并记下返回字段和值,从那里只需使用 $.each 即可内容。

这是另一个查询,前提相同,但目标是创建一条 SQL 语句以推送到 MS SQL 服务器并获取有关我本地收藏中的艺术家的 FreeDB 数据。

注意:这可以通过查询我的本地 sqlite 表、生成 sql 并使用不同的 conn 将其推送到 MS SQL 甚至更好地通过使用通用 proc 来完成,但现在让我们保持简单。

function PrepareMSSQLFilteredFreeDBTables(StartLetter, EndLetter, TempTableName) {

    var sqlSel = "SELECT * FROM ArtistData WHERE ArtistText BETWEEN '" + StartLetter + "' AND '" + EndLetter + "' ORDER BY ArtistText";
    var data = localData.exec(sqlSel);

    $('.array-cols').append('SELECT * INTO ' + TempTableName + ' FROM FreeDB WHERE DARTIST IN (');

    var iLen = (data[0].values.length - 1);

    $.each(data[0].values, function(a, b) {
        var sRes;
        if (a === iLen) { sRes = "'" + b[1].replace("'", "''") + "')"; }
        else { sRes = "'" + b[1].replace("'", "''") + "', "; }
        $('.array-cols').append(sRes);
    });
}
于 2016-07-03T16:37:36.787 回答