0

APIへの認証を扱っており、すでに別のライブラリを使用してそれを行っているため、ローカルJSONをCore DataエンティティにマップするためだけにRestKitを使用しようとしているので、RestKitにJSONの配列を渡すだけですデータ(正しく受信していることを確認しました)。RSS フィードにアクセスして Core にマップするために RestKit を使用する、私が作成した既存のアプリを適応させているため、基本的な必要なコンポーネント (データ モデル/エンティティ、NSManagedObject クラス、マネージド オブジェクト コンテキストなど) はすべてセットアップ済みです。データ。

調査の結果、これを達成するために使用する必要があるように思われ、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;
}

私の FoodTruckDataModel クラスは次のようになります。

+(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];
}

ただし、次の Core Data エラーが発生しているため、何かが正しく行われていません。

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'

データに対してマッピング操作を実行しているように見えますが、ログからわかるように、エンティティとマッピング情報が渡されていません(JSON データは消去されています)。 を使用していたときは問題なく動作していたので、何が間違っているのかわかりませんRKManagedObjectRequestOperation

誰かに提案や助けがあれば、大歓迎です!

4

1 に答える 1

1

最初の問題 (およびおそらく 2 番目の問題) の原因は次のとおりです。

FoodTruck *foodTruck = FoodTruck.new;

そのような管理対象オブジェクトをインスタンス化することは許可されていないためです。代わりに、NSEntityDescription を使用する必要があります。現在持っているコードは有効なインスタンスを作成しないため、使用しようとすると悪いことが起こります。

于 2013-05-26T06:03:08.533 に答える