我应该何时在另一个线程(而不是主线程)上执行某些SQLite操作?

时间:2011-02-18 22:47:31

标签: android sqlite

我的Android应用程序包含一个带有SQLiteOpenHelper类的SQLite数据库,以帮助管理它。在应用程序使用期间,用户可以在数据库上执行一些操作,例如添加/删除/更新等。

在某些时候,操作的大小将是已知的,如下所示:

  1. 用户点击按钮以保存项目
  2. SQLiteDatabase执行单个insert查询
  3. 用户继续使用应用
  4. 在应用程序的其他区域,操作可能很大,例如一次将10多个项目插入数据库。

    问题:

    • 我应该插入简单的操作,如插入/更新/删除/查看1项?
    • 将1个项目插入包含许多项目(如30+)的表格中需要更长的时间才能插入到没有项目的表格中吗?
    • 如果我不需要编写这样简单的操作,你在什么时候建议我开始线程化?

    当我说线程时,我的意思是使用不是主UI线程的线程。

    编辑:我意识到小型操作不需要花费太多时间,我可以很好地完成主线程上的操作。我只是担心在主线程上执行它们并且想要澄清是不好的做法!

3 个答案:

答案 0 :(得分:41)

一切的一般规则:如果它足够快,请在主线程上执行。如果没有,请使用工作线程。

除非你有一个非常庞大的数据库,否则单个操作几乎不会保证一个单独的线程。一般来说,数据库的设计可以很好地扩展,但是当然一个非常大的数据库(10,000多行?)会比一个小数据库慢一点。然而,30行是没有的。

如果你正在进行大量的操作,比如一堆查询或跨越多个表的复杂查询,我会开始线程化。

与所有内容一样 - 配置您的应用,如果它太慢,请进行优化。如果您的查询都不超过2毫秒,请不要编写一个很棒的同步超级duper多核就绪数据库处理程序。

答案 1 :(得分:6)

在优化之前始终进行测量!

确保您执行的数据库操作会影响用户体验,而不是开始寻找解决方案。

如果数据库内容变慢,则使用AsyncTask,它旨在在后台执行任务,然后在EDT上更新GUI。

答案 2 :(得分:2)

绝对没有理由在这里使用线程。只需返回光标,从光标中提取信息并将其返回到主活动。

具体来说,一个线程理想情况下会重复,直到某些事情发生或超时。由于您正在使用的数据库是在电话上,因此访问它几乎是零时间。

您还可以做的另一件事是创建一个Utility类来协助您的数据库交互活动。这将是您的活动调用与数据库交互的内容。具体来说,控制流程是这样的:

活动 - >实用程序 - >数据库

它在活动和数据库之间,使它们彼此隔离,并使它更容易访问它需要的任何东西,因为它不必直接进入数据库本身。