正确的删除和重新创建核心数据存储的方法

时间:2015-01-28 14:33:17

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext nspersistentstore

我想确认我删除Core Data存储(sqlite)的方法是正确的。它似乎工作没有崩溃,但想确认这是正确的方法。之后,当用户连接到数据库时,会自动生成一个新的sqlite文件。

以下是删除数据存储的代码:

 - (BOOL)dropDataStore{
 // ----------------------
 // This method removes all traces of the Core Data store
 // ----------------------

 NSError *_error = nil;
 NSURL *_storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Store.sqlite"];
 NSPersistentStore *_store = [persistentStoreCoordinator persistentStoreForURL:_storeURL];

 // Remove the SQL store and the file associated with it
 if ([persistentStoreCoordinator removePersistentStore:_store error:&_error]) {
 [[NSFileManager defaultManager] removeItemAtPath:_storeURL.path error:&_error];
 }

 if (_error) {
 return NO;
 }

 persistentStoreCoordinator = nil;
 managedObjectContext = nil;
 managedObjectModel = nil;

 return YES;
}

1 个答案:

答案 0 :(得分:0)

这不是一个好方法。

iOS 7及更高版本上的SQLite至少会在与其主文件相同的目录中创建日志文件。如果将这些遗留下来,可能会将旧数据保留在新文件中,或者损坏数据。所以至少您还需要删除Store.sqlite-shmStore.sqlite-wal

如果您的Core Data模型使用二进制属性并且为这些属性中的任何属性启用了“允许外部存储”,则这些属性的值可以存储在外部文件中。显然你的代码不会删除它们,但是没有记录这些文件的位置。

如果您希望删除Core Data持久性存储文件,则应该将这些文件放入自己的自定义子目录中,而不是直接放在文档目录中。然后,您可以递归地删除该目录中的所有内容,而不关心Core Data是否在持久性存储文件之外创建额外的文件。