我正在创建一个应用程序,它使用核心数据来存储来自 Web 服务器的信息。当有互联网连接时,该应用程序将检查条目中是否有任何更改并更新它们。现在,我想知道哪种方法最好。我数据库中的每个条目都有一个最后更新的时间戳。这两个中哪一个更有效:
- 浏览所有条目并检查时间戳以查看需要更新的条目。
- 删除整个实体并重新下载所有内容。
抱歉,这似乎是一个明显的问题,谢谢!
我正在创建一个应用程序,它使用核心数据来存储来自 Web 服务器的信息。当有互联网连接时,该应用程序将检查条目中是否有任何更改并更新它们。现在,我想知道哪种方法最好。我数据库中的每个条目都有一个最后更新的时间戳。这两个中哪一个更有效:
抱歉,这似乎是一个明显的问题,谢谢!
我最近做了类似的事情。
我通过分配唯一 ID 和全局“更新时间戳”并考虑“增量”更改来解决问题。
我解释得更好,我在用户首选项中存储了一个全局“最新更新”变量,默认值为 01/01/2010。
这大致是我的 JSON 服务:
response: {
metadata: {latestUpdate: 2013...ecc}
entities: {....}
}
然后,这就是发生的事情:
而已。我只是检索所需的更改,当然 Web 服务的结构是为了提供适当的列表。即:一个由数据库支持的网络服务,可以很好地处理这个问题,而让 iphone 只是一个“简单的客户端”。
但我不得不说,对于少量数据,在每次请求时下载整个列表仍然非常高效(并且没有更多错误)。
我会说选项1
是最有效的,因为很少有情况下下载所有内容(尤其是在具有大量数据的大型数据库中)比只下载您需要的部分更有效。
根据我们在上面评论中的讨论,您可以像这样使用版本控制对核心数据对象条目进行建模
CoreDataEntityPerson:
name : String
name_version : int
image : BinaryData
image_version : int
您现在可以通过以下方式对服务器 xml 进行建模:
<person>
<name>michael</name>
<name_version>1</name_version>
<image>string_converted_imageData</image>
<image_version>1</image_version>
</person>
现在,您可以按照以下步骤操作:
当响应到达并解析它时,您最初从实体创建一个新对象并直接填充数据。
下次,当您在服务器上执行更新时,您将条目的版本计数增加 1 并存储它。例如,假设名称 michael 现在更改为 abraham,那么服务器上 name_version 的版本计数将为 2
此更新的版本计数将包含在响应数据中。
现在,在将数据存储在同一个对象中时,如果发现版本计数相同,则可以跳过该条目的数据更新,但如果发现版本计数要更改,则需要更新该条目要完成。
这样,您可以有效地对每个条目执行检查并仅对更改的条目执行更新。
建议:
当您处理大量数据更新时,上述方法效果最佳。
在对象的简单文本条目的情况下,简单地覆盖所有条目上的数据就足够有效了。这也使数据响应模型保持简单。