我正在尝试通过删除商店并在其位置复制默认版本来重置CoreData数据库。以下在模拟器中工作正常,但是当它在设备上运行时(使用iOS 3.1.3和3.2.1进行测试),应用程序就好像数据库从未重置,直到应用程序重新启动。重新启动后,使用新初始化的数据库,一切都很好。是否存在某种需要通知新商店的后台缓存?
[我正在进行下面的错误检查,为了清楚起见,只删除这些行。当然,没有发生错误]
-(void)initializeUserData {
NSError *error = nil;
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"db.sqlite"];
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
[self.managedObjectContext lock];
[self.managedObjectContext reset];
NSPersistentStore *store = [persistentStoreCoordinator persistentStoreForURL:storeURL];
[persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storePath error:&error];
// copy the pre-populated database file
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"db" ofType:@"sqlite"];
[[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:&error];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];
[self.managedObjectContext unlock];
}
修改 不确定这是否意味着什么,但作为一个完整性检查,我打开-com.apple.CoreData.SQLDebug并在调用addPersistentStoreWithType后获取以下内容:
CoreData: annotation: Connecting to sqlite database file at "..."
在应用程序返回主循环后,会记录以下(我希望在调用removePersistentStore :)时记录:
CoreData: annotation: Disconnecting from sqlite database.
以后没有后续的“连接到数据库”消息,尽管正在访问数据库,因此我假设这些日志条目的奇数顺序只是记录完成的副作用。 ..
答案 0 :(得分:2)
您需要捕获BOOL返回值:
[persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storePath error:&error];
...因为我很确定如果因为它正在使用而无法删除该文件,它们都不会报告错误。我想一个或两个都没有错误地失败。
从您的描述中可以看出,上下文继续使用持久性存储,并且在重新启动之前永远不会删除它。我认为上下文不能放弃商店,因为它有连接到商店的活动对象。这反过来又阻止了persistentStoreCoordinator放弃文件,这会阻止文件管理器删除它。
您似乎正在使用线程,因此使用同一商店的另一个上下文也可能阻止其删除。
除非您使用基于文档的模式,否则我主张简单地从头开始重建Core Data堆栈以避免这些复杂情况。