12

RestKit 0.20を使用してJSONデータを解析し、データベースに保存しています。THereはマップされたエンティティSchoolClassであり、RestKitによって処理され、正常に保存されます。選択したクラスを格納するMyClassという別のエンティティがあります。これはデバイス上でのみローカルです。

MyClassエンティティを作成して保存するコードは次のとおりです

 NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
 MyClass* course = [managedObjCtx insertNewObjectForEntityForName:@"MyClass"];

 .. set the data for course here

 NSError *executeError = nil;
 if(![managedObjCtx save:&executeError]) {
      NSLog(@"Failed to save to data store");
 }

管理対象データストアを初期化するコードは次のとおりです

  // Initialize managed object store
    NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
    objectManager.managedObjectStore = managedObjectStore;

   /**
     Complete Core Data stack initialization
     */
    [managedObjectStore createPersistentStoreCoordinator];
    NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKMainDb.sqlite"];
    NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"];
    NSError *error;
    NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil 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];

保存が成功したようで、MyClasseTableViewControllerで保存されたMyClassエントリを読み取ることができました。ただし、アプリを閉じて再起動した後。フェッチされた結果が空であるため、MyClassTableViewControllerは空です。SQLiteBrowserを使用してsqliteファイルを開きましたが、MyClassテーブルが空です。MyClassエンティティはキャッシュにのみ保存され、永続ストアには保存されないようです。保存するためにRestKitが提供するAPIを呼び出す必要がありますか?ドキュメントを読み込もうとしましたが、見つかりませんでした。助けてください。

4

1 に答える 1

24

Tom のリードに感謝します。RestKit にはメソッドを持つ NSManagedObjectContext (RKAdditions) があることがわかりました。

- (BOOL)saveToPersistentStore:(NSError **)error

はい、ネストされた管理対象オブジェクトのコンテキストを処理するロジックがあります。これが機能する新しいコードです。1行だけ変更されていますが、正しい呼び出しを見つけるのに多くの時間がかかりました:(

#import "NSManagedObjectContext+RKAdditions.h"
     NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
     MyClass* course = [managedObjCtx insertNewObjectForEntityForName:@"MyClass"];

     .. set the data for course here

     NSError *executeError = nil;
     if(![managedObjCtx saveToPersistentStore:&executeError]) {
          NSLog(@"Failed to save to data store");
     }
于 2013-03-25T20:08:36.803 に答える