在我的 iOS 项目中,当用户注销时,我使用以下代码删除数据库:
NSPersistentStore *store = [_persistentStoreCoordinator.persistentStores lastObject];
NSError *error = nil;
NSURL *storeURL = store.URL;
[_persistentStoreCoordinator removePersistentStore:store error:&error];
_persistentStoreCoordinator = nil;
_managedObjectModel = nil;
_managedObjectContext = nil;
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];
但在此之后,如果我进行登录,即使文件之前已被删除,我仍然拥有与以前相同的文件。 (注意数据库不改名)
在以下链接中,Delete/Reset all entries in Core Data? 一个人添加了以下评论:
Update for iOS5+
With the introduction of external binary storage (allowsExternalBinaryDataStorage or Store in External Record File) in iOS 5 and OS X 10.7, simply deleting files pointed by storeURLs is not enough. You'll leave the external record files behind. Since the naming scheme of these external record files is not public, I don't have a universal solution yet. – an0 May 8 '12 at 23:00
有什么办法可以解决这个问题吗?谢谢
编辑:不认为它是相关的,但为了以防万一,这是该类的属性:
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
最佳答案
您很可能要离开现有的 WAL mode journal files在后面。默认情况下,任何名为 Foo.sqlite
的 Core Data 持久存储文件都将包含名为 Foo.sqlite-wal
和 Foo.sqlite-shm
的日志文件>。如果您不删除它们,那么当您创建一个新的 Foo.sqlite
时,您的大部分或全部数据将保留。
外部二进制文件也可能是个问题。
最好的方法是将您的核心数据文件放在一个自定义的子目录中。日志文件、外部二进制文件以及 Core Data 将来想到的任何其他内容也将放在该目录中。如果您想删除持久存储,您可以递归地删除该目录中的所有内容,而无需关心文件名是什么。
否则,请自行远程控制 wal
和 shm
文件。如果您使用的是外部二进制文件,请找出这些文件所在目录的名称并将其也删除。
关于ios - 核心数据数据库在数据库删除后保留文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27226677/