更新核心数据性能

时间:2013-08-26 04:20:29

标签: ios performance core-data

我正在创建一个使用核心数据来存储来自Web服务器的信息的应用。当有互联网连接时,应用程序将检查条目是否有任何更改并更新它们。现在,我想知道哪种方式最好。我的数据库中的每个条目都有一个上次更新的时间戳。这两个中的哪一个会更有效:

  1. 浏览所有条目并检查时间戳,以查看需要更新的条目。
  2. 删除整个实体并重新下载所有内容。
  3. 对不起,如果这似乎是一个明显的问题,谢谢!

3 个答案:

答案 0 :(得分:1)

我认为选项1最有效率,因为很少有下载所有内容的情况(特别是在包含大量数据的大型数据库中)比仅下载您需要的部分更有效

答案 1 :(得分:1)

我最近做了类似的事情。

我通过分配唯一ID和全局“更新时间戳”并考虑“delta”更改来解决问题。

我解释得更好,我有一个存储在用户首选项中的全局“最新更新”变量,默认值为01/01/2010。

这大致是我的JSON服务:

response: {
  metadata: {latestUpdate: 2013...ecc}
  entities: {....}
}

然后,这是正在发生的事情:

  1. 将“最新更新”传递给Web服务并检索实体列表
  2. 更新核心数据存储
  3. 如果核心数据一切顺利,服务元数据中的'latestUpdate'成为我用户首选项中存储的新“最新更新变量”
  4. 就是这样。我只是检索所需的更改,当然,Web服务的结构是为了提供正确的列表。这是:一个由数据库支持的Web服务,可以很好地处理这个问题,并让iphone只是一个“简单的客户端”。

    但我不得不说,对于少量数据,在每次请求时下载整个列表仍然非常高效(并且更无错误)。

答案 2 :(得分:0)

根据我们在上面的评论中的讨论,您可以使用版本控制(例如

)为核心数据对象条目建模
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. 当响应到达并解析它时,您最初会从实体创建一个新对象并直接填充数据。

  2. 下次,当您在服务器上执行更新时,将条目的版本计数增加1并存储它。 例如。让我们说michael的名字现在改为亚伯拉罕,然后服务器上的name_version版本计数将为2

  3. 此更新版本将包含在响应数据中。

  4. 现在,同时存储在同一个对象的数据,如果发现版本计数是相同的,那么该条目的数据更新可以跳过,但如果你发现版本计数被改变,那么需要更新该条目。

  5. 通过这种方式,您可以有效地对每个条目执行检查,并仅对更改的条目执行更新。

    建议:

    1. 当您处理大量数据更新时,上述方法效果最佳。

    2. 如果是对象的简单文本条目,则对所有条目的数据进行简单的覆盖就足够了。这也使数据响应模型变得简单。