Android:SQLite rawQuery-cursor的定位需要将近2秒

时间:2014-04-19 18:27:07

标签: android performance sqlite

我遇到sqllite的问题。我对我的数据库执行查询,它的速度非常慢(我在真实设备上调试)。 我向SystemTrace添加了Trace命令需要花费很多时间。事实证明,rawQuery.moveToFirst()的召唤是这里的瓶颈。根据系统性能跟踪,单独调用它需要超过1.5秒(!)

Cursor rawQuery = myDataBase.rawQuery(query, null); // takes 0.5 milliseconds
rawQuery.moveToFirst();
do {
            // assing values
} while (rawQuery.moveToNext());
rawQuery.close();

这非常慢。有人建议如何提高速度吗?

更新: 这里是我执行查询的两个表的sql。内部联接操作似乎需要这么多时间:

CREATE TABLE table_1 (_id int(7) NOT NULL PRIMARY KEY,  text_1 VARCHAR(20), text_2 VARCHAR(40));

CREATE TABLE translation (_id int(7), language VARCHAR(10), meaning VARCHAR(100), FOREIGN KEY (_id) REFERENCES table_1(_id));
CREATE INDEX lang_match ON translation (language);


myDataBase.rawQuery("Select a._id, a.text_1, a.text_2, b.meaning from table_1 a inner join translation b ON a._id=b._id AND b.language='eng' WHERE text_1 like ?", new String[] { s + "%" });

1 个答案:

答案 0 :(得分:1)

优化查询并将数据库操作移出主UI线程。

rawQuery()只编译SQL但不运行它。移动光标实际上运行已编译的SQL程序,并且在Android SQLite的情况下,有一个CursorWindow缓冲区,其中填充了游标数据。如果查询涉及例如很多I / O操作,填充光标窗口需要很长时间。