检查数据库中现有数据的最佳方法(iOS)

时间:2012-11-10 16:48:39

标签: iphone objective-c ios core-data

我正在开发一个管理消息的应用程序,我希望应用程序连接到服务器,获取消息并将其保存在数据库中(coredata)。如果消息已经存在,则不执行任何操作,如果不存在,请将它们添加到数据库中。

我正在考虑一些方法,但我不确切知道该怎么做。有帮助吗?提前致谢

3 个答案:

答案 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];
    }