【问题标题】:What is the proper way to run SQLite code off the UI thread when there are so many CRUD methods?当有这么多 CRUD 方法时,从 UI 线程运行 SQLite 代码的正确方法是什么?
【发布时间】:2016-12-21 19:48:23
【问题描述】:

当我在我的应用程序中编写数据库代码时,我有很多 CRUD 函数,其中大部分涉及将内容存储在 ContentValues 或使用 Cursors 或通过 SQLiteOpenHelper 对数据库对象执行操作的组合和等等等等。

对于我的应用程序中的每个对象,这意味着至少要编写 4 个(通常更多)方法。这很乏味,可能没有ORM那么复杂,我不明白如何正确使用,我担心它违反了DRY原则,但我对事情有更多的控制权。

但是,我也知道您不应该在 UI 线程之外运行 SQL 代码。这是否意味着我必须将我拥有的方法数量增加一倍,因为我需要一种方法来创建新线程/可运行,然后从那里调用相应的 CRUD 函数?

【问题讨论】:

  • 你可以做很多事情——我最近一直更喜欢使用 RXJava 来做背景工作——如果你已经熟悉 RX,你可以查看github.com/square/sqlbrite。来自谷歌的推荐在这里(developer.android.com/training/load-data-background/index.html),如果你遵循它,你可能会避免很多陷阱,所以推荐给那些新去 Android 的人——我只是觉得Loader 语义相当麻烦。希望这会有所帮助。
  • 编写数据库代码很乏味。没有真正的解决方法。您可以使用 ORM 等,但它们最终仍然很乏味,并且经常需要来自 db 的更多数据和对 db 的更多请求,因为要更改有关对象的任何内容,您现在需要获取整个事物。对我来说,没有太多数据表明它们确实改善了事情。关系数据不是一组对象,从效率或正确性的角度来看,将其视为一个对象很少能很好地工作。至于线程——如果一个请求很快,它完全可以在 UI 线程上完成。

标签: java android multithreading sqlite crud


【解决方案1】:

我建议您使用ContentProviderContentResolver 来管理您的数据库。您可以使用AsyncQueryHandler 轻松地将操作从主线程中移除。

我还创建了一个小型库来帮助您 - Bender

【讨论】:

    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多