删除和重新创建核心数据存储的正确方法
Posted
技术标签:
【中文标题】删除和重新创建核心数据存储的正确方法【英文标题】:Correct way of Dropping and Recreating Core Data Store 【发布时间】:2015-01-28 14:33:17 【问题描述】:我想确认我删除核心数据存储 (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】:这不是一个好方法。
ios 7 及更高版本上的 SQLite 至少会在与其主文件相同的目录中创建日志文件。如果您将这些留在后面,您可能会将旧数据保留在新文件中,或损坏数据。所以至少您还需要删除 Store.sqlite-shm
和 Store.sqlite-wal
。
如果您的 Core Data 模型使用二进制属性并且为任何这些属性启用了“允许外部存储”,那么这些属性的值可能会存储在外部文件中。显然您的代码不会删除这些文件,但这些文件的位置没有记录。
如果您希望删除 Core Data 持久存储文件,您应该真正将文件放入它们自己的自定义子目录中,而不是直接放入文档目录中。然后,您可以递归地删除该目录中的所有内容,而无需关心 Core Data 是否在持久存储文件之外创建额外文件。
【讨论】:
谢谢汤姆。我已经关闭了日志,所以 shm 和 wal 文件不是问题。我的模型中唯一的属性是浮点数、日期和整数。我这样做的原因是给用户一个选项“删除所有数据”。我认为这种方法是干净的,而不是清空每个实体中的对象。有了这些附加信息,我的函数声音了吗?谢谢。 这听起来不错,因为它实际上删除了数据。关闭日记功能实际上并不是一个好主意,这并不合理。这也是一个潜在的维护问题,以防以后启用日志或您最终将二进制属性添加到模型中。 谢谢汤姆。我关闭了日志以将所有数据保存在一个文件中。当使用 iTunes 文件共享备份以仅备份一个文件时,这对用户很有用(并且对他们来说很清楚)。是的,如果将来使用二进制属性,这将不是一个有效的解决方案。但是对于目前的情况,这种方法会导致崩溃或其他类型的损坏吗? 目前还没有其他标准的方式来删除日志文件吗? @SoheilNovinfard 不,因为 Apple 试图帮助开发人员使他们的数据更安全,而不是更不安全。以上是关于删除和重新创建核心数据存储的正确方法的主要内容,如果未能解决你的问题,请参考以下文章