在我的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? 一个人添加了以下评论:
iOS5 +更新
随着外部二进制存储的引入 (allowExternalBinaryDataStorage或Store in External Record File)in iOS 5和OS X 10.7,只是删除storeURL指向的文件不是 足够。您将保留外部记录文件。自从 这些外部记录文件的命名方案不公开,我没有 有一个通用的解决方案。 - 2012年5月8日23:00
已经有办法解决这个问题吗?感谢
编辑:不要认为它是相关的,但为了以防万一,这是该类的属性:
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
答案 0 :(得分:1)
您很可能会将现有的WAL mode journal files抛弃。默认情况下,任何名为Foo.sqlite
的Core Data持久性存储文件都将包含名为Foo.sqlite-wal
和Foo.sqlite-shm
的日志文件。如果您不删除这些内容,则在您创建新Foo.sqlite
时,大部分或全部数据都会保留。
外部二进制文件也可能是个问题。
最好的方法是将Core Data文件放在自定义子目录中。日志文件,外部二进制文件以及Core Data未来想到的其他内容也将在该目录中。如果要删除持久性存储,可以递归删除该目录中的所有内容,而无需关心文件名是什么。
否则,请自行远程访问wal
和shm
个文件。如果您正在使用外部二进制文件,请找出这些文件所在目录的名称,并将其删除。