2

Chrome アプリで SQLite に SQL.js を使用しています。クエリを実行するために外部 db ファイルを読み込んでいます。変更をローカル ストレージに保存して永続化したいと考えています。すでにここで定義されています。

https://github.com/kripken/sql.js/wiki/Persisting-a-Modified-Database

私は記事で定義されているのと同じ方法を使用しています-

function toBinString (arr) {
    var uarr = new Uint8Array(arr);
    var strings = [], chunksize = 0xffff;
    // There is a maximum stack size. We cannot call String.fromCharCode with as many arguments as we want
    for (var i=0; i*chunksize < uarr.length; i++){
        strings.push(String.fromCharCode.apply(null, uarr.subarray(i*chunksize, (i+1)*chunksize)));
    }
    return strings.join('');
}

function toBinArray (str) {
    var l = str.length,
            arr = new Uint8Array(l);
    for (var i=0; i<l; i++) arr[i] = str.charCodeAt(i);
    return arr;
}

データをストレージに保存 -

var data =toBinString(db.export());
chrome.storage.local.set({"localDB":data});

ストレージからデータを取得するには-

chrome.storage.local.get('localDB', function(res) {
    var data = toBinArray(res.localDB);
      //sample example usage
      db = new SQL.Database(data);
      var result = db.exec("SELECT * FROM user");
});

クエリを作成すると、このエラーが発生します-

エラー: ファイルが暗号化されているか、データベースではありません

chrome.storage と localStorage に値を格納するための違いはありますか? localStorage を使用して正常に動作するため、ここで実際の例を見つけてください-

http://kripken.github.io/sql.js/examples/persistent.html

ここで提案されているドキュメントとして - https://developer.chrome.com/apps/storage

localStorage とは異なり、chrome.storage API で stringify と parse を使用する必要はありません。オブジェクトと配列を直接保存できます。

変換せずにdb.exportから返された結果を保存しようとすると、このエラーが発生します-

値を JSON にシリアル化できません

それで、クロムのストレージにdbエクスポートを保存する方法を教えてください。私が間違っていることはありますか?

4

0 に答える 0