将二进制数据存储为Web Sql数据库中的字符串

时间:2010-07-31 03:27:06

标签: javascript performance sqlite local-storage

好的,我正在通过xhr下载数据块,我想将其存储在本地以用于chrome扩展。

起初我能够将它存储在localStorage中,但后来我需要继续使用localStorage无法处理的更大的块。所以我决定将它存储在Web Sql Database中。但是,我能够将数据完全按照下载的方式存储在localStorage中,但是当我尝试将数据存储在数据库中时,数据会丢失或者出现错误。

像这样:

//this way the data gets lost because it is filtered to prevent SQL injection attacks
tx.executeSql('INSERT INTO files (id, content) VALUES (?,?)', [fileID,file]);

//this method gives an error (unrecognized token) because the data contains byte values in the string  
tx.executeSql('INSERT INTO files (id, content) VALUES (?, "' + file + '")', [id]);

我能想到将数据导入数据库的另一种方法是使用btoa(file),它可以工作,但我认为如果必须执行{{},性能将受到相当大的影响{每次存储/使用数据时都会{1}} / btoa

那么我的问题是,如何在不使用atob的情况下将数据存储在数据库中,或者如果不可能btoa使用多少性能?

我也非常确定btoa使用SQLite以及Web Sql数据库,为什么我不能像localStorage那样轻松地将数据放在后者中?

1 个答案:

答案 0 :(得分:0)

看看这样的东西,你需要对二进制数据进行base64编码,因为它需要是可打印的字符。

http://www.webtoolkit.info/javascript-base64.html

虽然这会导致二进制数据大小增加四倍。

您需要将其编码为十六进制我相信,也许,使用SQLite表示二进制数据

tx.executeSql('INSERT INTO files (id, content) VALUES (2, "0xBADF00D12840F32");');

例如,后一种SQLite方法可能更有效。