3

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

起初我能够将它存储在 中localStorage,但后来我需要转移到 localStorage 无法处理的更大块。所以我决定将它存储在Web Sql 数据库中。但是,我能够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),它可以工作,但我认为如果每次存储/使用数据时都必须执行btoa/ ,性能将受到相当大的影响atob.

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

我也相当确定它localStorage使用 SQLite 以及 Web Sql 数据库,那么为什么我不能尽可能轻松地将数据放入后者localStorage呢?

4

1 回答 1

0

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

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

不过,这将导致二进制数据的大小增加约四倍。

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

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

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

于 2011-09-22T22:31:55.670 回答