2

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

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

4

3 回答 3

2

我建议使用 Restkit 框架http://restkit.org
Reskit 提供与核心数据的集成。

使用 Restkit 的优点:
- 将 HTTP 请求/响应 API,以及对象映射、离线/缓存支持与 Core Data 结合在一个框架中
- 对象映射意味着您正在编写干净的代码,您定义您的类以及它们如何映射到 JSON 属性,然后使用几行代码进行 GET/POST/DELETE
- 核心数据支持意味着您的项目可以离线工作,在线工作时数据是同步的,但在您需要离线时保持持久
- 框架很好缺点


- 仅适用于 JSON REST API
- 某些方面可能存在陡峭的学习曲线
- 如果您使用不完全“标准”的 REST API,可能会很有挑战性

于 2012-11-10T17:01:42.657 回答
1

最简单的方法是将guid属性(例如 type 的标识符NSString)添加到您感兴趣的实体,并在导入数据时检查该 guid。

在这里,您有两种方法:让服务器为您生成 guid 或在客户端(iPhone、iPad 等)实现您自己的算法。在这两种情况下,您都需要确保每条消息的 guid 都是唯一的。

因此,例如,假设服务器生成消息(并且每条消息都有自己的 guid)。导入数据时,您还会保存每个消息对象的 guid。如果您已经有带有特定 guid 的消息,则不要添加它,否则添加它。这可以使用Find-or-Create模式来完成(请参阅实现 Find-or-Create Efficiently)。

希望有帮助。

于 2012-11-10T17:13:21.153 回答
1

这很简单,我花了一些时间来学习这个,我在我的大多数应用程序中都使用它。

首先,您需要获取项目的 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];
    }
于 2012-11-10T17:29:08.930 回答