【问题标题】:CoreData: Replace .sqlite causes crashCoreData:替换 .sqlite 导致崩溃
【发布时间】:2012-03-05 19:20:02
【问题描述】:

当我更新我的应用程序时,我在启动时使用我的 CoreData 模型做一些事情,然后我将持久存储使用的 .sqlite 文件替换为:

NSArray *stores = [__persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [__persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}
__persistentStoreCoordinator = nil;
[self persistentStoreCoordinator];

__managedObjectContext = nil;
[self managedObjectContext];

一切正常,就像它应该做的那样。但是当我通过主页按钮关闭应用程序时,它会崩溃:

[NSPersistentStoreCoordinator retain]: message sent to deallocated instance

我正在使用 ARC ...实际上你可以说它没关系,因为它在关闭时会崩溃,所以你不会注意到崩溃。但是,当然,这不是一个选择,必须有正确的方法来做到这一点!?

有什么想法吗?为什么会有一个保留发送到NSPersistenStoreCoordinator?它与__persistentStoreCoordinator = nil; 有关,但我需要将其置零,否则它不会使用新的.sqlite。

干杯!

【问题讨论】:

  • 带下划线的 ivar 名称的意义在于让您在不应该使用它们时清楚地看到它们,例如因此,当您打算键入 self.managedObjectContext 时,不要键入 managedObjectContext。这可能与您的问题有关。另外,您的非返回访问器类型方法是做什么的?例如[self managedObjectContext] 就在自己的线路上?

标签: ios core-data automatic-ref-counting nsmanagedobjectcontext


【解决方案1】:

最后我找到了一种更好的(并且有效的)方法来替换 .sqlite 和 storeCoordinator 的存储,而无需将 persistentStoreCoordinator 设为 nil:

NSArray *stores = [__persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [__persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}

NSString *storePath = [[self applicationDocumentsDirectoryString] stringByAppendingPathComponent:@"PictureApp.sqlite"];

NSURL *storeUrl = [NSURL fileURLWithPath:[[self applicationDocumentsDirectoryString] stringByAppendingPathComponent:@"PictureApp.sqlite"]];

NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"PictureApp" ofType:@"sqlite"];
if (defaultStorePath) {
    [[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}

NSError *error = nil;
[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];

【讨论】:

  • 你不知道你帮了我多少..非常感谢。我会给你一个拥抱的人。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多