在我的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];
但是在此之后,如果我登录,我会继续拥有与以前相同的文档,即使该文件之前已被删除。(请注意,数据库不会更改名称(
在以下链接中,删除/重置核心数据中的所有条目?有人补充了以下评论:
iOS5+ 更新
随着外部二进制存储的引入 (允许外部二进制数据存储或存储在外部记录文件中(在 iOS 5和OS X 10.7,简单地删除商店URL指向的文件不是 足够。您将留下外部记录文件。自从 这些外部记录文件的命名方案不是公开的,我没有 有一个通用的解决方案。– an0 五月 8 '12 在 23:00
已经有什么方法可以解决这个问题吗?谢谢
编辑:不要认为它相关,但以防万一,这是类的属性:
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
很可能您正在留下现有的 WAL 模式日志文件。默认情况下,任何名为 Foo.sqlite
之类的核心数据持久存储文件都将具有名为 Foo.sqlite-wal
和 Foo.sqlite-shm
的日志文件。如果不删除这些内容,则创建新Foo.sqlite
时将保留大部分或全部数据。
外部二进制文件也可能是一个问题。
最好的方法是将核心数据文件放在自定义子目录中。日志文件、外部二进制文件以及 Core Data 将来想到的任何其他内容也将进入该目录。如果要删除持久存储,可以递归删除该目录中的所有内容,而不关心文件名是什么。
否则,请自行远程wal
和shm
文件。如果您使用的是外部二进制文件,请找出这些文件所在的目录的名称并将其删除。