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

Iphone CoreData的重置在模拟器中工作,而不是在设备中(直到应用程序重新启动),iphone,core-data,Iphone,Core Data,我试图通过删除一个存储并复制一个默认版本来重置CoreData DB。以下内容在模拟器中运行良好,但当它在设备上运行(使用iOS 3.1.3和3.2.1进行测试)时,应用程序的行为就好像在重新启动应用程序之前从未重置数据库一样。重新启动后,使用新初始化的数据库,一切正常。是否存在需要通知新店的后台缓存 [我在下面进行错误检查,只是为了清晰起见删除了这些行。当然,没有错误发生] -(void)initializeUserData { NSError *error = nil; NSString *

我试图通过删除一个存储并复制一个默认版本来重置CoreData DB。以下内容在模拟器中运行良好,但当它在设备上运行(使用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.

尽管数据库正在被访问,但之后没有后续的“连接到数据库”消息,因此我假设这些日志条目的奇怪顺序只是日志记录方式的副作用…

您需要捕获以下BOOL返回:

[persistentStoreCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storePath error:&error];
。。。因为我非常确定,如果文件因为正在使用而无法删除,那么两者都不会报告错误。我想一个或两个都失败了

从您的描述来看,这听起来像是上下文继续使用持久存储,并且在重新启动之前它不会被删除。我认为上下文不能放弃存储,因为它有连接到存储的活动对象。这反过来会阻止persistentStoreCoordinator放弃该文件,从而阻止文件管理器删除该文件

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


除非您使用基于文档的模式,否则我建议您只需从头开始重建核心数据堆栈,以避免这些复杂性

啊,打得好。不幸的是,这似乎不是问题所在。我为这两行添加了BOOL捕获(以及copyItemAtPath:forgood measure),但它们都没有失败。我并没有真正使用线程,锁定/解锁行只是我在调试时添加的“以防万一”行,以查看它是否会修复一些我不知道的奇怪问题。对不起,我应该在发布之前删除它们。对不起,我是新来的。从头开始重建堆栈将意味着释放ManagedObjectContext和PersistentStoreCoordinator,并重新创建对象?好的,是的,我明白了。你说得对,最好是用核武器摧毁一切,从头开始