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

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-shmStore.sqlite-wal

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

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

【讨论】:

谢谢汤姆。我已经关闭了日志,所以 shm 和 wal 文件不是问题。我的模型中唯一的属性是浮点数、日期和整数。我这样做的原因是给用户一个选项“删除所有数据”。我认为这种方法是干净的,而不是清空每个实体中的对象。有了这些附加信息,我的函数声音了吗?谢谢。 这听起来不错,因为它实际上删除了数据。关闭日记功能实际上并不是一个好主意,这并不合理。这也是一个潜在的维护问题,以防以后启用日志或您最终将二进制属性添加到模型中。 谢谢汤姆。我关闭了日志以将所有数据保存在一个文件中。当使用 iTunes 文件共享备份以仅备份一个文件时,这对用户很有用(并且对他们来说很清楚)。是的,如果将来使用二进制属性,这将不是一个有效的解决方案。但是对于目前的情况,这种方法会导致崩溃或其他类型的损坏吗? 目前还没有其他标准的方式来删除日志文件吗? @SoheilNovinfard 不,因为 Apple 试图帮助开发人员使他们的数据更安全,而不是更不安全

以上是关于删除和重新创建核心数据存储的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

需要一个持久的地方来存储我的核心数据存储的备份

核心数据 - 删除持久存储时出现死锁

删除我的核心数据存储中的所有数据

核心数据重载数据库

处理核心数据的问题

CKAN:删除资源时自动删除数据存储表