安卓游标movetofirst性能问题

3

我正在尝试优化我的应用程序。我注意到cursor.movetofirst()方法在某种程度上会减慢我的代码的性能。

Cursor cursor = myDbHelper.getDayInfo(new SimpleDateFormat("yyyy-MM-dd").format(myCalendar.getTime());

以上代码在2.1模拟器中执行时间为10毫秒,而且

if(cursor != null && cursor.moveToFirst()) 

这行代码大约花费了1.6秒的时间。我做了一些搜索,有些人说可以在另一个线程或异步任务中实现,但这会使代码更加复杂。我只是想弄清楚这个光标到底发生了什么。

有人能简化或者给出与我的问题相关的数据库性能提升的提示吗?

3个回答

2

这篇文章已经有一段时间没有被标记为已回答,但你并没有得到很好的答案。即使在非常大的表格上进行单行查询,查询通常也不应该超过1.6秒。如果速度慢,原因是您没有为所查询的列创建索引,因此必须扫描整个表才能找到这些值。如果您创建一个索引,可以将时间缩短到几分之一秒。


是的,已经过了一段时间,但后来我为该列创建了一个索引,增加了我的原始数据,但没有观察到任何性能差异。也许这与创建文本列的索引逻辑有关,该列不是唯一的。 - Fredrick Gauss
我同意 - 经过测试,添加索引并不会减少 moveToFirst() 的时间。 - ılǝ
我遇到了同样的问题,但只有在第一次获取数据时。在同一张表上进行下一次不同的where条件查询要快得多。这让我感觉数据应该先被触碰一次,然后性能会更好。 - mcfly soft

0

自然而然,moveToFirst() 方法所需的时间比其他代码要长得多。实际上进行了数据查询,这会调用数据库通信、数据读取等操作。你实际上无法对此做任何事情。建议是正确的 - 将所有长时间操作移动到 AsyncTask


您是指所有需要单行查询的长时间操作吗? - Fredrick Gauss
在发现表格有id、foreign_id和date三列,而我只为date创建了索引后,我感到需要添加一条重要的评论。但很快意识到我应该同时为foreign_id和date两列创建索引。以下是查询语句:<b>CREATE INDEX idx ON mytable (foreign_id, date)</b>。并且列的顺序很重要。 - Fredrick Gauss

0
如果游标持有的数据集很大,移动游标会花费一些时间。你需要在单独的线程上执行这样的数据密集型操作。使用一个AsyncTask可能会让你的代码稍微复杂一些,但是这是值得的。这样做可以避免用户线程被阻塞,从而保证良好的用户界面体验。

1
谢谢您的快速回复,但是结果数据集只有一行,而总数据库包含数千行。我认为这不是数据集的问题。查询返回了一行带有10个列。 - Fredrick Gauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接