2014-06-20 32 views
0

我需要使用WebSQL存儲包含二進制數據的JavaScript字符串。我知道可以使用用戶技術(IndexedDB,LocalStorage,...),但由於某些原因,我需要堅持使用WebSQL。由於配額有限且數據可能變大,我不希望對數據進行Base64編碼。在WebSQL中存儲包含二進制數據的JS字符串

考慮以下JS代碼(和相應的JSFiddle):

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
function test(str){ 
    db.transaction(function (tx) { 
     tx.executeSql('DROP TABLE IF EXISTS test'); 
     tx.executeSql('CREATE TABLE test (val)'); 
     tx.executeSql('INSERT INTO test(val) VALUES (?)',[str]); 
     tx.executeSql('SELECT val FROM test',[],function(tx,result){ 
      var str2 = result.rows.item(0).val; 
      console.log(str + " (" + str.length + ") - " + str2 + " (" + str2.length + ")"); 
     }); 
    }); 
} 
test("Foo"); 
test("A\0B"); 

其輸出

美孚(3) - 富(3)

AB(3) - 甲(1)

在Chrome和Safari中。

正如你所看到的零字節和被WebSQL吃掉之後的所有charachters。你知道是否有任何方法可以將這個字符串放入WebSQL中而不用擴大它(例如通過Base64編碼),並且不使用其他存儲技術?

回答

0

其實它確實工作。問題不是存儲二進制字符串,而是檢索它。當結果包含零字節時,String被認爲已完成。

WebSQL提供了函數hex,它返回字符串的十六進制表示。當存儲例如"A\0B"時,該功能將返回。使用此我得到了我的示例工作(見updated JSFiddle):

//convert hex representation back to string 
function hex2str(hex){ 
    var result = new Array(hex.length/2); 
    for(var i = 0, j = 0; j < hex.length; i++, j+=2) 
     result[i] = String.fromCharCode(parseInt(hex.substr(j,2),16)); 
    return result.join(""); 

} 
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
function test(str){ 
    db.transaction(function (tx) { 
     tx.executeSql('DROP TABLE IF EXISTS test'); 
     tx.executeSql('CREATE TABLE test (val)'); 
     tx.executeSql('INSERT INTO test(val) VALUES (?)',[str]); 
     //magic occurs here 
     tx.executeSql('SELECT hex(val) as val FROM test',[],function(tx,result){ 
      var str2 = hex2str(result.rows.item(0).val); 
      console.log(str + " (" + str.length + ") - " + str2 + " (" + str2.length + ")"); 
     }); 
    }); 
} 
test("Foo"); //Foo (3) - Foo (3) 
test("A\0B"); //AB (3) - AB (3) 
0

在websql中保存二進制數據的唯一方法是base64編碼。 如果你的數據真的很大,並且容易跨瀏覽器配額的5/10MB限制,那麼base64轉換不會是主要的罪魁禍首(它將數據平均膨脹4/3)。 如果您的原始數據已經即將超過配額,則最好考慮可能的解決方法。

+0

看到我自己的答案,我得到了它,而無需重新編碼它的工作 – muffel

相關問題