我正在开发一个管理消息的应用程序,我希望该应用程序连接到服务器,获取消息并将它们保存在数据库(coredata)中。如果消息已经存在,则不执行任何操作,如果不存在,则将它们添加到数据库中。
我正在考虑一些方法来做到这一点,但我不知道该怎么做。有什么帮助吗?提前致谢
我正在开发一个管理消息的应用程序,我希望该应用程序连接到服务器,获取消息并将它们保存在数据库(coredata)中。如果消息已经存在,则不执行任何操作,如果不存在,则将它们添加到数据库中。
我正在考虑一些方法来做到这一点,但我不知道该怎么做。有什么帮助吗?提前致谢
我建议使用 Restkit 框架http://restkit.org
Reskit 提供与核心数据的集成。
使用 Restkit 的优点:
- 将 HTTP 请求/响应 API,以及对象映射、离线/缓存支持与 Core Data 结合在一个框架中
- 对象映射意味着您正在编写干净的代码,您定义您的类以及它们如何映射到 JSON 属性,然后使用几行代码进行 GET/POST/DELETE
- 核心数据支持意味着您的项目可以离线工作,在线工作时数据是同步的,但在您需要离线时保持持久
- 框架很好缺点
:
- 仅适用于 JSON REST API
- 某些方面可能存在陡峭的学习曲线
- 如果您使用不完全“标准”的 REST API,可能会很有挑战性
最简单的方法是将guid属性(例如 type 的标识符NSString
)添加到您感兴趣的实体,并在导入数据时检查该 guid。
在这里,您有两种方法:让服务器为您生成 guid 或在客户端(iPhone、iPad 等)实现您自己的算法。在这两种情况下,您都需要确保每条消息的 guid 都是唯一的。
因此,例如,假设服务器生成消息(并且每条消息都有自己的 guid)。导入数据时,您还会保存每个消息对象的 guid。如果您已经有带有特定 guid 的消息,则不要添加它,否则添加它。这可以使用Find-or-Create模式来完成(请参阅实现 Find-or-Create Efficiently)。
希望有帮助。
这很简单,我花了一些时间来学习这个,我在我的大多数应用程序中都使用它。
首先,您需要获取项目的 ID,例如 messageID。当您获取包含所有项目的 JSON 时,例如使用 AFNetworking,您将收到 NSDictionaries 中的对象数组。
在解析项目之前,将存储项目的所有 ID 加载到 NSMutableDictionary 中(key => messageID,value objectID,这与 Core Data 故障有关)。
不要忘记在某处初始化 NSMutableArray:
_dictionaryOfEventIDAndObjectID = [NSMutableDictionary dictionary];
- (void)prepareDictionaryOfMessageIDs
{
[self.dictionaryOfEventIDAndObjectID removeAllObjects];
NSError *error = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Message"];
[fetchRequest setResultType:NSDictionaryResultType];
NSExpressionDescription *objectIDDescription = [[NSExpressionDescription alloc] init];
objectIDDescription.name = @"objectID";
objectIDDescription.expression = [NSExpression expressionForEvaluatedObject];
objectIDDescription.expressionResultType = NSObjectIDAttributeType;
[fetchRequest setPropertiesToFetch:@[objectIDDescription, @"messageID"]];
NSArray *objectsDict = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (NSDictionary *objectDict in objectsDict) {
[self.dictionaryOfMessageIDAndObjectID setObject:[objectDict valueForKeyPath:@"objectID"] forKey:[objectDict valueForKeyPath:@"messageID"]];
}
}
然后在获取的数据完成块中添加如下内容:
for (NSDictionary *objectDict in objectsDict) {
NSString *fetchedID = [objectDict objectForKey:@"id"];
if ([self.dictionaryOfMessageIDAndObjectID objectForKey:fetchedID]) {
continue;
}
[self parseMessageFromDictionary:objectDict];
}