RestKit:无法使用 coredata 执行映射

Posted

技术标签:

【中文标题】RestKit:无法使用 coredata 执行映射【英文标题】:RestKit : Not able to perform mapping using coredata 【发布时间】:2013-11-08 13:13:10 【问题描述】:

我正在使用 rest kit 0.20.3 和 Xcode 5。没有核心数据我能够执行所有的 rest kit 操作,但是当我用核心数据尝试它时,我什至无法执行 @ 987654321@ 由于某些问题。我想不通。我是核心数据的新手。所以请帮忙。这是我的代码:

AppDelegate.m

@implementation CardGameAppDelegate

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    RKLogConfigureByName("RestKit", RKLogLevelWarning);
    RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);
    RKLogConfigureByName("RestKit/Network", RKLogLevelTrace);

    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://192.168.1.3:3010/"]];


    RKManagedObjectStore *objectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:self.managedObjectModel];

    objectManager.managedObjectStore = objectStore;

    RKEntityMapping *playerMapping = [RKEntityMapping mappingForEntityForName:@"Player" inManagedObjectStore:objectStore];
    [playerMapping addAttributeMappingsFromDictionary:@@"id": @"playerId",
                                                        @"name": @"playerName",
                                                        @"age" : @"playerAge",
                                                        @"created_at": @"createdAt",
                                                        @"updated_at": @"updatedAt"];



    RKResponseDescriptor *responseDesc = [RKResponseDescriptor responseDescriptorWithMapping:playerMapping method:RKRequestMethodGET pathPattern:@"/players.json" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

    [objectManager addResponseDescriptor:responseDesc];

    PlayersTableViewController *ptvc = (PlayersTableViewController *)self.window.rootViewController;
    ptvc.managedObjectContext = self.managedObjectContext;

    return YES;

和 playerTableViewController.h 的代码

#import <UIKit/UIKit.h>

@interface PlayersTableViewController : UITableViewController <NSFetchedResultsControllerDelegate>

@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

@end

和PlayerTableViewController.m的get方法:

-(void)loadPlayers
    [[RKObjectManager sharedManager] getObjectsAtPath:@"/players.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
        [self.refreshControl endRefreshing];
     failure:^(RKObjectRequestOperation *operation, NSError *error) 
        [self.refreshControl endRefreshing];
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    ];

我收到以下错误:

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to perform mapping: No `managedObjectContext` assigned. (Mapping response.URL = http://192.168.1.3:3010/players.json)'

【问题讨论】:

检查为什么你的托管对象上下文没有被分配。 我没有得到的数据...在哪里可以做到? 浏览 RestKit 文档并查看您分配托管对象上下文的位置。这就是第三方软件的问题,你需要弄清楚。 【参考方案1】:

仅仅创建objectStore 是不够的,您需要完成其余的核心数据堆栈设置。您还应该在 RestKit 中执行此操作,而不是在应用程序委托中(这是 Apple 提供的默认配置)。这将类似于(根据您的要求量身定制):

NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

[managedObjectStore createPersistentStoreCoordinator];

NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"XXXX.sqlite"];
NSError *error;
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath
                                                                 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];

managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

【讨论】:

如果不在应用程序委托中,我应该把这段代码放在哪里。抱歉这些类型的问题,但我对这些东西很陌生。谢谢 不,此代码可以进入应用委托。我的意思是应用程序委托不应该明确地创建managedObjectContextmanagedObjectModelpersistentStoreCoordinator(我猜这目前是由于您的@synthesize 语句。 我已经使用您的代码从主详细信息模板开始完全编写了我的代码......它工作并在我的日志中显示我已经从我的服务器收到了所有对象,即= 11,但问题是我不能让它出现在我的tableView中。请帮助 如果您使用的是获取结果控制器,它应该是自动的(模板与委托有观察)。您可能应该开始一个新问题,显示您的映射/响应描述符/mappingResult 的结果是您的成功块。 我已经发布了我的问题Here。请帮忙。谢谢

以上是关于RestKit:无法使用 coredata 执行映射的主要内容,如果未能解决你的问题,请参考以下文章

无法让 Restkit 0.20 + CoreData 工作

RestKit 和 CoreData 无法关闭日志模式的问题

RestKit - 清除数据

CoreData + Restkit 当用户退出应用程序时要执行啥任务?

CoreData 和 JSON 映射器

集成 RestKit 和 MagicalRecord 时出现 CoreData 轻量级迁移错误