3

使用 RestKit v0.20.0-rc1,我成功地创建了 CoreData 映射并从捆绑的 JSON 文件中导入对象,并让数据在多个构建中保持不变。但是,当我创建自己的实体并保存它时,如果我使用 [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext,该实体会在下一次构建时立即消失,但如果我使用 [RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext,该实体会正确保留。

    UserAccount *userAccount = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:managedObjectContext];
    userAccount.userID = @(userID);
    [userAccount addContactMethodsObject:phone];
    NSError *error = nil;
    if(![managedObjectContext save:&error])
        NSLog(@"%@", error);

在上述代码中使用任一 managedObjectContext 都不会出错,并且从同一上下文中提取的任何内容都会正确返回实体。但是在后续构建中,如果我使用 mainQueueManagedObjectContext,即使上面的代码在主线程上运行,fetches 也将始终返回 nil。

有什么我想念的吗?

4

1 回答 1

9

当您在使用 mainQueueManagedObjectContext 创建的上下文上使用 save: 时,它不会将其更改保存到存储中。根据 RKManagedObjectStore 的文档(我的粗体):

托管对象上下文层次结构旨在将主线程与磁盘 I/O 隔离并避免死锁。因为主上下文管理自己的私有队列,所以保存主队列上下文不会导致对象被保存到持久存储中。还必须保存主要上下文,以便将对象持久化到磁盘。

如果您想保留您的更改并仍然使用 mainQueueManagedObject 上下文,请尝试使用

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

这将推动上下文层次结构的变化。

RKManagedObjectStore 的相关文档可以在http://restkit.org/api/latest/Classes/RKManagedObjectStore.html#//api/name/persistentStoreManagedObjectContext找到

restkit 的 NSManagedObject 类别的文档可以在 http://restkit.org/api/0.20.0-pre3/Categories/NSManagedObjectContext+RKAdditions.html找到

于 2013-03-26T22:36:53.943 回答