【问题标题】:ContentProvider and multi-threadingContentProvider 和多线程
【发布时间】:2015-10-06 06:26:25
【问题描述】:

我一直在考虑这种情况。

假设我有一个 SQLite 数据库包裹在 ContentProvider 中,数据库中的数据通过 SyncAdapter 每 10 分钟运行一次发送到 Web 服务。 要知道哪些行已发送到 Web 服务,使用状态列(0 = 未发送,1 = 发送)。

应用 UI 是一个使用 LoaderManager.LoaderCallbacks 填充的列表,以及用户在其中输入数据的另一个视图(表单)。

SyncAdapter 使用onPerformSyncContentProviderClient 参数查询未发送的数据 (0) 并将行更新为已发送状态 (1)

我困惑的原因是已经发送的数据可以重新发送多次的场景。用户打开一个已发送的表单并编辑其数据,这会将状态列更改为 0,因此同步适配器选择已编辑的行。

现在,假设同步适配器选择一行并开始发送数据,同时用户打开相同的数据行,编辑一些列并更新。然后当 webservice 完成接收数据时,同步适配器将 state 列更新为 1。

现在该行包含不会发送的数据。对?

我应该在从同步适配器更新之前将我发送的所有数据与数据库中的数据进行比较,是这样吗?或者我可以使用该框架以更复杂的方式处理这种情况吗?

期待听到您在这种情况下的感受。

【问题讨论】:

    标签: android multithreading sqlite android-contentprovider android-syncadapter


    【解决方案1】:

    你发现你有两个以上的状态:

    • 已更改且必须发送(或重新发送)的行;
    • 已发送但尚不知道被服务器接受的行;和
    • 服务器接受的行。

    【讨论】:

    • 哦,你完全正确,我没有意识到。谢谢
    【解决方案2】:

    作为@CL。正确地说你有两个以上的状态。

    一个简单的解决方案可以是在行转换时锁定行不被编辑。

    【讨论】:

    • 好主意,但我不认为我想限制用户进行编辑。为了使其对用户透明,如果原始行处于转换状态,我可能会创建一个 tmp 表来存储行,并且一旦同步适配器完成,查找那些 tmp 行并更新原始行。我喜欢这样,绝对比只有两个状态并比较数据要好。谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    相关资源
    最近更新 更多