RestKit RKObjectManager:getObjectsAtPath - 自定义处理

Posted

技术标签:

【中文标题】RestKit RKObjectManager:getObjectsAtPath - 自定义处理【英文标题】:RestKit RKObjectManager:getObjectsAtPath - custom processing 【发布时间】:2014-02-12 21:57:46 【问题描述】:

在从服务器获取对象列表时,我遇到了 RestKit 0.20 在我的数据库中创建重复项的问题。我在本地创建并发送到服务器的对象在保存映射结果时不会更新,而是被复制。我认为它与这个错误有关:https://github.com/RestKit/RestKit/issues/1613,所以我正在寻找临时修复,因为我必须尽快发货。当结果返回时

  [myRKObjectManager getObjectsAtPath:path parameters:params success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 

我可以在执行之前从中剔除重复项

  [myRKObjectManager.managedObjectStore.mainQueueManagedObjectContext saveToPersistentStore:&error])

?我已经浏览了文档,但不了解如何剔除不需要的插入。

更新:@Wain 的答案:

这样设置:

myRKobjectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:urlString]];
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

NSError *error;

NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:[RKApplicationDataDirectory() stringByAppendingPathComponent:[self databaseFilename]] fromSeedDatabaseAtPath:nil  withConfiguration:nil options:@NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES error:&error];

NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

// Create the managed object contexts
[managedObjectStore createManagedObjectContexts];

// Configure a managed object cache to ensure we do not create duplicate objects
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

// Set up response routing
RKEntityMapping *partyMapping = [Party objectMappingInManagedObjectStore:managedObjectStore withCustomerMapping:customerMapping notificationMapping:notificationMapping];

RKResponseDescriptor *partyResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:partyMapping method:RKRequestMethodGET pathPattern:@"api/allparties" keyPath:@"parties" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[[RKObjectManager sharedManager] addResponseDescriptor:partyResponseDescriptor];

实体类被声明:

@interface Party : NSManagedObject<PostRequestDelegate>

使用类别

NSManagedObject (ActiveRecord)

派对对象是使用

创建的
Party *newParty = [Party object];

并通过以下方式保存在数据库中:

    [myRKobjectManager.managedObjectStore.mainQueueManagedObjectContext saveToPersistentStore:&error]

使用的映射:

RKEntityMapping* partyMapping = [RKEntityMapping mappingForEntityForName:@"Party" inManagedObjectStore:managedObjectStore];
[partyMapping addAttributeMappingsFromDictionary:@
                                                   @"added_date": @"addedDate",
                                                   @"id": @"partyId",
                                                   @"modified_date": @"modifiedDate",
                                                   @"name": @"name",
                                                   ];
partyMapping.identificationAttributes=@[@"addedDate"];
[partyMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"customer" toKeyPath:@"customer" withMapping:customerMapping]];
[partyMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"notification_history" toKeyPath:@"notifications" withMapping:notificationMapping]];

【问题讨论】:

您使用什么映射?您是否在使用多种环境?您如何保存本地创建的对象? @Wain 我已经用更多设置信息更新了帖子。谢谢! 为什么要创建自己的上下文而不是让 RestKit 创建它们? 我从 RestKit 代码中复制了它,选择器:[managedObjectStore createManagedObjectContexts];所以我让 RestKit 创建它们,是的。 那么您是否设置添加到您创建的对象的日期并保存它们?还是您要发布对象? 【参考方案1】:

您是否尝试过将您的 IdentificationAttributes 更改为您的 partyId?我假设这是您的每个派对对象的唯一属性。然后Restkit 将检查核心数据中是否已经存在具有相同partyId 的对象并更新它而不是创建新对象。

阅读http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html 文档中的“实体识别”部分,了解有关其工作原理的更多详细信息。

【讨论】:

以上是关于RestKit RKObjectManager:getObjectsAtPath - 自定义处理的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.20:restkit 对象映射使属性映射加倍

将“import <RestKit/RestKit.h>”添加到 AppDelegate.m 的问题

RestKit 与直接 CoreData

Restkit 0.20.x cocoapods 安装问题 - 编译但找不到 RestKit 的导入

RestKit / Core Data / Offline - 我需要 UUID 还是 RestKit 足够聪明?

RestKit 核心数据集成