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

jam*_*mes 42 sqlite android

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

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

  1. 用户单击按钮以保存项目
  2. SQLiteDatabase执行单个insert查询
  3. 用户继续使用app

在应用程序的其他区域,操作可能很大,例如一次将10多个项目插入数据库.

问题:

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

当我说线程我的意思是使用一个不是主UI线程的线程.

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

Ebo*_*ike 43

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

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

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

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

  • 在谷歌IO上关于Android REST客户端应用程序的讨论怎么样?他说"永远不要在主线程的上下文中执行数据库操作".我希望我不会脱离这​​种情况,但这可能是一种很好的做法. (15认同)
  • 我仍然支持最后一句 - 不要优化什么不慢.如果您的数据库非常小,则不需要对其进行优化.添加多线程会大大增加应用程序的复杂性,并为同步错误引入一个迷人的滋生地,这些错误很难被发现和调试. (5认同)
  • 使用加载程序,它们现在作为兼容性库的一部分提供. (3认同)

Pet*_*ego 6

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

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

如果数据库内容变慢,那么使用AsyncTask,它被设计为在后台执行任务,然后在EDT上更新GUI.