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];
【讨论】:
如果不在应用程序委托中,我应该把这段代码放在哪里。抱歉这些类型的问题,但我对这些东西很陌生。谢谢 不,此代码可以进入应用委托。我的意思是应用程序委托不应该明确地创建managedObjectContext
、managedObjectModel
、persistentStoreCoordinator
(我猜这目前是由于您的@synthesize
语句。
我已经使用您的代码从主详细信息模板开始完全编写了我的代码......它工作并在我的日志中显示我已经从我的服务器收到了所有对象,即= 11,但问题是我不能让它出现在我的tableView中。请帮助
如果您使用的是获取结果控制器,它应该是自动的(模板与委托有观察)。您可能应该开始一个新问题,显示您的映射/响应描述符/mappingResult
的结果是您的成功块。
我已经发布了我的问题Here。请帮忙。谢谢以上是关于RestKit:无法使用 coredata 执行映射的主要内容,如果未能解决你的问题,请参考以下文章
无法让 Restkit 0.20 + CoreData 工作
RestKit 和 CoreData 无法关闭日志模式的问题