核心数据数据库在数据库删除后保留文档



在我的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-walFoo.sqlite-shm 的日志文件。如果不删除这些内容,则创建新Foo.sqlite时将保留大部分或全部数据。

外部二进制文件也可能是一个问题。

最好的方法是将核心数据文件放在自定义子目录中。日志文件、外部二进制文件以及 Core Data 将来想到的任何其他内容也将进入该目录。如果要删除持久存储,可以递归删除该目录中的所有内容,而不关心文件名是什么。

否则,请自行远程walshm文件。如果您使用的是外部二进制文件,请找出这些文件所在的目录的名称并将其删除。

最新更新