Core Data数据库在删除数据库后保留文档

时间:2014-12-01 10:46:50

标签: ios core-data

在我的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;

1 个答案:

答案 0 :(得分:1)

您很可能会将现有的WAL mode journal files抛弃。默认情况下,任何名为Foo.sqlite的Core Data持久性存储文件都将包含名为Foo.sqlite-walFoo.sqlite-shm的日志文件。如果您不删除这些内容,则在您创建新Foo.sqlite时,大部分或全部数据都会保留。

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

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

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