我创建了一个javascript类,让我使用gear或html5(如果可用)存储来存储字符串化的json对象。该代码适用于Android 1.5和2.0。当我将许多物体保存到齿轮中时,即使在PC(谷歌镀铬/齿轮)上也很慢。 CPU没有变高但页面没有响应45秒。在手机上它更糟糕。我删除了makeJsonString(oContent)
,但它是一样的。代码的html5部分(在IE8中)可以快速工作(插入300个元素需要2秒)。
在手机上,我当时只进行了一次插入。
在构造函数中:
this.db = google.gears.factory.create('beta.database');
this.db.open("foobar");
this.db.execute('CREATE TABLE IF NOT EXISTS ' + this.sDatabase + ' (AUTO_ID INTEGER PRIMARY KEY AUTOINCREMENT, CONTENT_JSON TEXT);');
保存部分:
var sContent = makeJsonString(oContent);
this.db.execute("INSERT INTO " + this.sDatabase + " (CONTENT_JSON) VALUES (?)", [sContent]);
测试代码:
var oContent = {};
oContent.field = "test'os";
for (var i = 1; i < 300; i++)
db.saveContent(oContent);
makeJsonString
使用json2.js或原生函数。
修改
Google Chrome CPU分析: alt text http://img685.imageshack.us/img685/4317/savecontent.jpg
编辑2
来自:http://www.sqlite.org/faq.html#q19
实际上,SQLite很容易做到50,000 每秒或更多INSERT语句 在普通的台式电脑上。但它 只会做几十笔交易 每秒。交易速度是 受到转速的限制 你的磁盘驱动器。交易 通常需要两个完整的 盘片的旋转,其中 在7200RPM磁盘驱动器上限制您 每秒约60笔交易。 交易速度受磁盘限制 驱动速度因为(默认情况下) SQLite实际上一直等到数据 确实安全地存储在磁盘上 交易前的表面 完成。那样,如果你突然 失去力量或者你的操作系统崩溃,你的 数据仍然安全。有关详情,请阅读 关于SQLite中的原子提交..
默认情况下,每个INSERT语句都是 自己的交易。但如果你 包含多个INSERT语句 与BEGIN ... COMMIT然后全部 插入被分组为一个 交易。提交所需的时间 交易按所有方式摊销 随附的插入语句等 每个插入语句的时间是 大大减少了。
另一种选择是运行PRAGMA 同步= OFF。这个命令会 导致SQLite不等待数据 到达磁盘表面,这将 使写操作看起来像 快多了。但如果你失去了力量 在交易的中间,你的 数据库文件可能已损坏。
添加交易(BEGIN
,COMMIT
)提高了300次插入的效果
从45秒到1秒。仍然需要在手机上测试它。
编辑3
电话仍然很慢:(