0

目的:我必须从文件中创建实体。

因此,实体在 CoreData 中代表我的数据模型,并且文件包含该实体的所有信息。

我从 Internet 获得的所有文件。为此,我使用 AFNetworking 框架。

我如何获取文件(算法):

  1. 请求 plist 文件。Plist 文件具有我必须下载的其他 url 的值。
  2. 当 plist 下载到设备上的我的 Documents 目录时。我解析它。
  3. 当我解析 plist 时,我从 NSDictionary 中代表此 plist 的每个项目中获取 url。
  4. 然后我从这个 url 请求 zip 文件。
  5. 下载 zip 文件后,我将它们解压缩并转到下一步。
  6. 解析解压缩文件并创建数据模型。

这是我的问题。我有存储在本地和存储在服务器上的文件版本,当服务器上的版本发生变化时,我需要用实际数据重新加载我的数据模型。不好的方法是再次从服务器加载所有数据,然后删除存储中的所有实体并从新数据中创建新实体。但这首先不是专业的方式,其次它是对流量的额外负担,因为如果我只有一个需要重新加载的实体,为什么我必须重新加载处于实际状态的其他实体。所以也许有人知道这个问题的最佳实践。当然,我可以创建我的解决方案并且它会起作用,但我想看看人们如何解决这个问题,并找出我的解决方案和其他解决方案的差异。

4

2 回答 2

1

这是微不足道的。您只需保留一个带有上次更新时间戳的属性,然后从您的服务器请求更改的实体和新实体。然后根据需要插入、更新或删除。

于 2013-06-06T12:05:46.077 回答
0

听起来您在谈论查找或创建。根据数据集的大小和您的性能要求,您可以通过以下几种方式执行此操作:

第一种方法是获取现有的 Core Data 对象并将它们存储在字典中,并以实体的唯一属性作为键。然后,当您下载新数据时,您可以为每个解析的对象获取此键并检查您的字典以查找(并可选地更新)任何现有对象,或创建一个新对象:

NSArray *fetchedObjects = //Fetch the existing objects;    

NSMutableDictionary *existingObjects = [NSMutableDictionary dictionary];

for (MyClass *object in fetchedObjects)
    [existingObjects setObject:object forKey:object.uniqueKey];

//Now iterate through the new data (using JSON as example here)

NSDictionary *downloadedItems = //Download data and serialise into JSON

for (NSDictionary *item in downloadedItems){

    NSString *uniqueValue = [item valueForKey:@"uniqueKey"];

    MyClass *object = [existingObjects objectForKey:uniqueValue];

    if (object==nil){

       object = //Insert new MyClass entity into MOC
       object.uniqueKey = uniqueValue;

       //Set any other values you only need to set once
    }

    //Set any values you may need to update every time
    //This would be where to check a modified date attribute
}

第二种方式更复杂,并且涉及更少的内存开销。它在Core Data Programming Guide的 Efficiently Importing Data 部分中有描述。

该指南提供了一个良好的开端,但并未提供完整的解决方案;我在这里尝试了自己的答案:基本数组比较算法

于 2013-06-06T14:18:15.273 回答