[英]Best way to check existent data in the database (iOS)
我正在开发一个用于管理消息的应用程序,并且希望该应用程序连接到服务器,获取消息并将其保存在数据库(coredata)中。 如果消息已经存在,则不执行任何操作;如果不存在,则将它们添加到数据库中。
我正在考虑一些方法,但我不知道该怎么做。 有什么帮助吗? 提前致谢
我建议使用Restkit框架http://restkit.org
Reskit提供与Core Data的集成。
使用Restkit的优点:
-将HTTP请求/响应API以及对象映射,脱机/缓存支持与Core Data结合在一起,全部集成在一个框架中
-对象映射意味着您正在编写简洁的代码,定义类以及它们如何映射到JSON属性,然后在执行GET / POST / DELETE之后只需几行代码
-核心数据支持意味着您的项目可以离线工作,在线工作时数据是同步的,但是当您离线时数据是持久的
-框架维护良好
缺点:
-仅适用于JSON REST API
-在某些方面可能会有陡峭的学习曲线
-如果您使用的不是完全“标准”的REST API,可能会遇到挑战
最简单的方法是将guid属性(例如,类型为NSString
的标识符)添加到您感兴趣的实体,并在导入数据时检查该guid。
在这里,您有两种方法:让服务器为您生成Guid或在客户端(iPhone,iPad等)实现自己的算法。 在这两种情况下,您都需要确保每个消息的GUI都是唯一的。
因此,例如,假设服务器生成了消息(每个消息都有自己的GUID)。 导入数据时,还要保存每个消息对象的GUID。 如果您已经有带有特定GUID的消息,则不要添加它,否则就添加它。 可以使用“ 查找或创建”模式来完成此操作(请参阅有效地实现查找或创建 )。
希望能有所帮助。
这很简单,我花了一些时间来学习它,我在大多数应用程序中都使用了它。
首先,您需要获取的项目的ID,例如messageID。 当您使用所有项目(例如,使用AFNetworking)获取JSON时,您将在NSDictionaries中收到一个对象数组。
在解析项目之前,将存储的项目的所有ID加载到NSMutableDictionary中(键=> messageID,值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];
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.