0

我遇到了一个现有的 iOS 应用程序。它从 Web 服务下载 JSON,并在运行时将 JSON 解析为地图注释对象以显示在地图上。这是相对较快的,因为只有大约 2000 条记录。

问题是我现在想通过询问“自[日期]更新”记录来更新/删除记录。当我得到这些记录时,我不知道我将如何更新 JSON。

我觉得唯一的选择之一可能是在创建地图点之前将对象存储到 SQLite 或类似的东西中。因此,将对 SQLite 记录进行更新,我可以重新创建注释。

有没有人有更好的主意?如果可能的话,我想继续使用原始的 JSON 方法

4

2 回答 2

0

为什么不使用本地 JSON 副本的创建/修改日期,而在解析新 JSON 时忽略旧记录?这是我在几个应用程序中用于 JSON 和 XML 数据馈送的方法,它总是像 ccharm 一样工作

于 2012-10-24T21:52:20.850 回答
0

在我看来,Core Data 将是最好的选择。

从长远来看,将大量记录存储在 plist 或纯 JSON 中并不是一个好主意。使用 Core Data,您可以根据需要轻松获取记录、更新和删除记录。更新数据后,您可以使用注释重新获取和更新地图。

您应该查看可以帮助将数据映射到 NSManagedObjects 的 MagicalRecord。

例如,以这个 JSON 为例:

result: [
        { longitude: ...,
          latitude: ...,
          locationName: ...
        },
        { longitude: ...,
          latitude: ...,
          locationName: ...
        }
        ],
 status: "ok"

您可以创建具有以下属性的 NSManagedObject:

MyLocationObject:
longitude (double)
latitude (double)
locationName (string)

然后,使用 MagicalRecord,您可以简单地执行以下操作来解析和保存对象:

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
     // loop through all the locations
     for (NSDictionary *locationDictionary in [response objectForKey:@"result"]) {
         // first we will do a fetch in the database to see if we already have the object
         // I am using the location name as a reference but if you have a unique ID in the JSON, use that instead
         MyLocationObject *locationObject = [MyLocationObject findFirstByAttribute:@"locationName" withValue:[locationDictionary objectForKey:@"locationName"];
         // if locationObject is nil we need to create a new record
         if (!locationObject) {
             locationObject = [MyLocationObject createInContext:localContext];
         }
         // now simple map the JSON to the object
         [locationObject importValuesForKeysWithObject:locationDictionary];
     }
}];

您可以使用 AFNetworking 之类的东西,它会自动将 JSON 响应解析为适当的 NSObject(字典/数组)以供您使用。

于 2012-10-25T00:42:37.643 回答