核心数据的重置在模拟器中工作,而不是设备(直到应用程序重新启动)

时间:2010-07-30 14:09:11

标签: iphone core-data

我正在尝试通过删除商店并在其位置复制默认版本来重置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.

以后没有后续的“连接到数据库”消息,尽管正在访问数据库,因此我假设这些日志条目的奇数顺序只是记录完成的副作用。 ..

1 个答案:

答案 0 :(得分:2)

您需要捕获BOOL返回值:

[persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storePath error:&error];

...因为我很确定如果因为它正在使用而无法删除该文件,它们都不会报告错误。我想一个或两个都没有错误地失败。

从您的描述中可以看出,上下文继续使用持久性存储,并且在重新启动之前永远不会删除它。我认为上下文不能放弃商店,因为它有连接到商店的活动对象。这反过来又阻止了persistentStoreCoordinator放弃文件,这会阻止文件管理器删除它。

您似乎正在使用线程,因此使用同一商店的另一个上下文也可能阻止其删除。

除非您使用基于文档的模式,否则我主张简单地从头开始重建Core Data堆栈以避免这些复杂情况。