我正在使用 RestKit 0.20 解析 JSON 数据并保存到数据库。
这里有一个映射实体 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来保存?我试图通读该文档但找不到它。请帮忙。
感谢Tom的带领,我发现RestKit有NSManagedObjectContext(RKAdditions),它有一个方法:
- (BOOL)saveToPersistentStore:(NSError **)error
是的,它确实有处理嵌套托管对象上下文的逻辑。
这是有效的新代码,仅更改一行,但花了很多时间才能找到正确的调用:(
#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");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)