RestKit 保存 PersistentStore 不起作用

Posted

技术标签:

【中文标题】RestKit 保存 PersistentStore 不起作用【英文标题】:RestKit saveToPersistentStore doesnt work 【发布时间】:2014-04-03 05:35:33 【问题描述】:

我正在使用 RestKit 来实现我的休息。我从服务器获取数据并在收到数据后调用saveToPersistentStore,这也是成功的,但是当我关闭互联网并再次加载该页面时,它在商店中找不到任何数据。

这里是初始化流程-

NSURL *modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Storage" ofType:@"momd"]];
// NOTE: Due to an ios 5 bug, the managed object model returned is immutable.
NSManagedObjectModel *managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

// Initialize the Core Data stack
[managedObjectStore createPersistentStoreCoordinator];

NSPersistentStore __unused *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error];
NSAssert(persistentStore, @"Failed to add persistent store: %@", error);

[managedObjectStore createManagedObjectContexts];

// Set the default store shared instance
[RKManagedObjectStore setDefaultStore:managedObjectStore];

我使用 mainQueue 处理所有事情 -

    controller.managedObjectContext = managedObjectStore.mainQueueManagedObjectContext;

这是执行获取的函数:

[CMLRKSharedManager getNewsForUser:userProfile
                             urlParams:dict
                               success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
       [self.tableView reloadData];
       NSLog(@"Fetched object count %lu %@ %@", (unsigned long)self.fetchedResultsController.fetchedObjects.count , self.fetchedResultsController, self.fetchedResultsController.managedObjectContext);
       NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;

       NSError *executeError = nil;
       if(![managedObjCtx saveToPersistentStore:&executeError]) 
           NSLog(@"Failed to save to data store");
        
       else
           NSLog(@"SAVE SUCCESSFUL");
     failure:^(RKObjectRequestOperation *operation, NSError *error) 
        [self.tableView reloadData];
    ];

输出:

2014-04-02 22:24:01.547 获取的对象计数 4

2014-04-02 22:24:01.555 保存成功

现在我终止应用程序,关闭 wifi 并再次启动应用程序。该表现在是空白的,我看到 fetchResultsController 在控制台日志中看到 0 个项目

Apr 2 22:24:36 : In numberOfRows Fetched object count 0

我不知道为什么......

@wain 我更新代码如下-

NSError *error = nil;
NSURL *modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Cover" ofType:@"momd"]];
// NOTE: Due to an iOS 5 bug, the managed object model returned is immutable.
NSManagedObjectModel *managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL] mutableCopy];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

// Initialize the Core Data stack
[managedObjectStore createPersistentStoreCoordinator];

评论了这两行

//    NSPersistentStore __unused *persistentStore = [managedObjectStore addInMemoryPersistentStore:&error];
//    NSAssert(persistentStore, @"Failed to add persistent store: %@", error);
//    

而是添加了 sqlite db,但现在应用程序崩溃了

BOOL success = RKEnsureDirectoryExistsAtPath(RKApplicationDataDirectory(), &error);
if (! success) 
    RKLogError(@"Failed to create Application Data Directory at path '%@': %@", RKApplicationDataDirectory(), error);

NSString *path = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"Store.sqlite"];
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:path fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error];
if (! persistentStore) 
    RKLogError(@"Failed adding persistent store at path '%@': %@", path, error);

【问题讨论】:

上下文已保存,无需再次保存。您正在使用内存存储 - 应用程序是否从内存中删除/您的初始化代码在哪里运行? 【参考方案1】:

根据您的描述,问题在于您只有一个内存存储:

[managedObjectStore addInMemoryPersistentStore:&error];

所以没有任何东西保存到磁盘。您应该更改它以便使用 SQLite 存储。这会将数据保存到磁盘,并且通常在大多数使用场景中效果更好。

【讨论】:

我觉得自己像个白痴! :) 感谢您的澄清.. 我认为 createPersistentStoreCoordinator 会关心持久性.. 我更换了持久性存储,但应用程序崩溃了.. 我更新了上面的代码.. tia! 如果我也注释掉这个 - [managedObjectStore createPersistentStoreCoordinator];它不会崩溃,并且数据会通过禁用的 wifi 持久保存。 我猜你有一些电话顺序错误。 addSQLitePersistentStoreAtPath 如果需要,创建协调器... 现在从服务器中删除的对象不会自动更新。使用 RKManagedObjectCache 仍然是最好的方法吗?您可以指出我的任何文档都会很棒。 RK 教程很少。蒂亚! nm 我用 fetchRequestBlocks 弄明白了 :)

以上是关于RestKit 保存 PersistentStore 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 强制 CoreData 保存

使用 RestKit 下载和保存大文件

RestKit 保存 PersistentStore 不起作用

RestKit:创建一个对象而不保存它

多个对象没有得到保存的核心数据restkit

RestKit 仅保存响应数组中的最后一项