Ios RestKit 0.20.1将本地JSON映射到核心数据

Ios RestKit 0.20.1将本地JSON映射到核心数据,ios,objective-c,json,core-data,restkit,Ios,Objective C,Json,Core Data,Restkit,我正试图使用RestKit将本地JSON映射到我的核心数据实体,因为我正在处理对API的身份验证,并且已经在使用另一个库来实现这一点,所以我只是将JSON数据数组传递给RestKit(我已经验证了我接收的是正确的)。我已经设置了所有必要的基本组件(数据模型/实体、NSManagedObject类、托管对象上下文等),因为我正在修改我编写的一个现有应用程序,该应用程序使用RestKit访问RSS提要并将其映射到核心数据 通过研究,我似乎应该使用RKManagedObjectMappingOpera

我正试图使用RestKit将本地JSON映射到我的核心数据实体,因为我正在处理对API的身份验证,并且已经在使用另一个库来实现这一点,所以我只是将JSON数据数组传递给RestKit(我已经验证了我接收的是正确的)。我已经设置了所有必要的基本组件(数据模型/实体、NSManagedObject类、托管对象上下文等),因为我正在修改我编写的一个现有应用程序,该应用程序使用RestKit访问RSS提要并将其映射到核心数据

通过研究,我似乎应该使用
RKManagedObjectMappingOperationDataSource
来实现这一点,并为此改编了我在单元测试中发现的一个示例:

-(void)performMapping
{
    FoodTruck *foodTruck = FoodTruck.new;
    RKEntityMapping *mapping = [ObjectMappings FoodTruckArticleMapping];
    RKManagedObjectStore *store = [[FoodTruckDataModel sharedDataModel] objectStore];
    RKManagedObjectMappingOperationDataSource *mappingDS = [[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:store.mainQueueManagedObjectContext cache:store.managedObjectCache];
    mappingDS.operationQueue = [NSOperationQueue new];
    RKMappingOperation *operation = [[RKMappingOperation alloc] initWithSourceObject:self.moreStatuses destinationObject:foodTruck mapping:mapping];
    operation.dataSource = mappingDS;
    NSError *error = nil;
    [operation performMapping:&error];
    [mappingDS.operationQueue waitUntilAllOperationsAreFinished];
}
我的对象映射在单独的映射类中完成,如下所示:

+(RKEntityMapping *)FoodTruckArticleMapping
{
    RKEntityMapping *jsonMapping = [RKEntityMapping mappingForEntityForName:@"FoodTruck" inManagedObjectStore:[[FoodTruckDataModel sharedDataModel] objectStore]];
    jsonMapping.identificationAttributes = @[@"tweetID"];

    [jsonMapping addAttributeMappingsFromDictionary:@{
 @"text": @"tweet", @"user.screen_name": @"foodTruckName", @"id": @"tweetID", @"created_at": @"timeStamp"}];

    return jsonMapping;
}
+(id)sharedDataModel {
    static FoodTruckDataModel *__sharedDataModel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        __sharedDataModel = [[FoodTruckDataModel alloc] init];
    });

    return __sharedDataModel;
}

- (NSManagedObjectModel *)managedObjectModel
{
    return [NSManagedObjectModel mergedModelFromBundles:nil];
}

-(id)optionsForSQLiteStore
{
    return @{
         NSInferMappingModelAutomaticallyOption: @YES,
         NSMigratePersistentStoresAutomaticallyOption: @YES
         };
}

-(void)setup
{
    self.objectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[self managedObjectModel]];

    [self.objectStore createPersistentStoreCoordinator];

    NSString *path = [RKApplicationDataDirectory()     stringByAppendingPathComponent:@"FoodTruckxxx.sqlite"];
    NSLog(@"Setting up store at %@", path);
    [self.objectStore addSQLitePersistentStoreAtPath:path
                          fromSeedDatabaseAtPath:nil
                               withConfiguration:nil
                                         options:self.optionsForSQLiteStore
                                           error:nil];

    [self.objectStore createManagedObjectContexts];

    self.objectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:self.objectStore.persistentStoreManagedObjectContext];
}
我的FoodTruckDataModel类如下所示:

+(RKEntityMapping *)FoodTruckArticleMapping
{
    RKEntityMapping *jsonMapping = [RKEntityMapping mappingForEntityForName:@"FoodTruck" inManagedObjectStore:[[FoodTruckDataModel sharedDataModel] objectStore]];
    jsonMapping.identificationAttributes = @[@"tweetID"];

    [jsonMapping addAttributeMappingsFromDictionary:@{
 @"text": @"tweet", @"user.screen_name": @"foodTruckName", @"id": @"tweetID", @"created_at": @"timeStamp"}];

    return jsonMapping;
}
+(id)sharedDataModel {
    static FoodTruckDataModel *__sharedDataModel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        __sharedDataModel = [[FoodTruckDataModel alloc] init];
    });

    return __sharedDataModel;
}

- (NSManagedObjectModel *)managedObjectModel
{
    return [NSManagedObjectModel mergedModelFromBundles:nil];
}

-(id)optionsForSQLiteStore
{
    return @{
         NSInferMappingModelAutomaticallyOption: @YES,
         NSMigratePersistentStoresAutomaticallyOption: @YES
         };
}

-(void)setup
{
    self.objectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:[self managedObjectModel]];

    [self.objectStore createPersistentStoreCoordinator];

    NSString *path = [RKApplicationDataDirectory()     stringByAppendingPathComponent:@"FoodTruckxxx.sqlite"];
    NSLog(@"Setting up store at %@", path);
    [self.objectStore addSQLitePersistentStoreAtPath:path
                          fromSeedDatabaseAtPath:nil
                               withConfiguration:nil
                                         options:self.optionsForSQLiteStore
                                           error:nil];

    [self.objectStore createManagedObjectContexts];

    self.objectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:self.objectStore.persistentStoreManagedObjectContext];
}
但是,由于我遇到了以下核心数据错误,某些操作没有正确执行:

2013-05-25 19:38:17.867 FoodTrucks[37340:c07] CoreData: error: Failed to call designated initializer on NSManagedObject class 'FoodTruck'
我在这方面也遇到了麻烦:

2013-05-25 19:38:17.887 FoodTrucks[37340:4903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
它看起来好像在对我的数据执行映射操作,但它没有被传递给我的实体和映射信息,从我的示例中可以看出,我不确定我做错了什么,因为我以前使用
RKManagedObjectRequestOperation
时它工作正常


如果有人有任何建议或帮助,我们将不胜感激

第一个问题(可能也是第二个问题)的原因是:

FoodTruck*FoodTruck=FoodTruck.new


因为不允许您实例化这样的托管对象。相反,您必须使用NSEntityDescription。您目前使用的代码没有创建有效的实例,因此当您尝试使用它时,会发生一些不好的事情。

谢谢!是的,经过进一步思考,这似乎是一个问题,因为NSManagedObjects的全部要点是它们是动态的,您不需要自己实例化它们——我只是不确定作为目标对象传递什么我在RestKit的0.10到0.20升级说明中使用的行,位于“核心数据”部分;尽管如此,它可能不适用于这种特定情况。