我正在开发一个管理消息的应用程序,我希望应用程序连接到服务器,获取消息并将其保存在数据库中(coredata)。如果消息已经存在,则不执行任何操作,如果不存在,请将它们添加到数据库中。
我正在考虑一些方法,但我不确切知道该怎么做。有帮助吗?提前致谢
答案 0 :(得分:2)
我建议使用Restkit框架http://restkit.org
Reskit提供与Core Data的集成
使用Restkit的优点:
- 将HTTP请求/响应API与对象映射,离线/缓存支持与核心数据相结合,所有这些都集中在一个框架中
- 对象映射意味着您正在编写干净的代码,您定义了类以及它们如何映射到JSON属性,然后您使用几行代码进行GET / POST / DELETE
- 核心数据支持意味着您的项目可以脱机工作,数据在线工作时是同步的,但是当您需要离线时持久性
- 框架维护良好
缺点:
- 仅适用于JSON REST API
- 某些方面可能存在陡峭的学习曲线
- 如果您使用的REST API并非完全“标准”,那么可能会遇到挑战。
答案 1 :(得分:1)
最简单的方法是将 guid 属性(例如,类型为NSString
的标识符)添加到您感兴趣的实体中,并在导入数据时检查该guid。
在这里,您有两种方法:让服务器为您生成guid或在客户端(iPhone,iPad等)实现您自己的算法。在这两种情况下,您都需要确保guid对于每条消息都是唯一的。
因此,例如,假设服务器生成消息(并且每条消息都有自己的guid)。导入数据时,还会为每个消息对象保存guid。如果您已经有一个带有特定guid的消息,则不添加它,否则添加它。这可以使用查找或创建模式完成(请参阅Implementing Find-or-Create Efficiently)。
希望有所帮助。
答案 2 :(得分:1)
这很简单,我花了一些时间来学习这个,我在大多数应用程序中使用它。
首先,您需要获取项目的ID,例如messageID。 当您使用所有项目获取JSON时,例如使用AFNetworking,您将在NSDictionaries中接收一组对象。
在解析项目之前,在NSMutableDictionary中加载存储项目的所有ID(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];
}