如何防止备份带有外部文件的 Core Data 数据库?

Posted

技术标签:

【中文标题】如何防止备份带有外部文件的 Core Data 数据库?【英文标题】:How can I prevent a Core Data database with external files from being backed up? 【发布时间】:2013-06-02 22:00:33 【问题描述】:

我们有一个使用 Core Data 来存储数据的应用。一些数据来自服务器,大小可变,虽然通常很小,但也可能很大(几兆字节)。我们使用启用了“允许外部存储”的二进制数据字段来存储此数据。

我们的应用因违反规则 2.23 而被拒绝,因为我们正在存储可以从服务器重新下载的数据,并且没有将其标记为从备份中排除。

好的,很公平,所以我想将我们的数据库标记为从备份中排除。标记数据库本身很容易:

    BOOL succ = [storeURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    if (!succ) 
        NSLog(@"Error setting %@ to be excluded from backups: %@", storeURL, error);
    

但这仅涵盖 SQLite 文件本身。 Core Data 存储外部文件时,会将它们存储在单独的目录中:

.../Private Documents/MyDatabase.sqlite
.../Private Documents/.MyDatabase_SUPPORT/_EXTERNAL_DATA/(files here)

我需要将外部存储的文件标记为不可备份。我可以在 .MyDatabase_SUPPORT 文件夹上设置 NSURLIsExcludedFromBackupKey,但我没有看到任何支持的方式来获取此文件夹的名称。

我可以自己构建它,但我不喜欢依赖这个实现细节。是否有任何受支持的方法可以找出 Core Data 将数据库的外部文件存储在哪里?

【问题讨论】:

【参考方案1】:

创建一个子目录,在该子目录中创建数据库,然后在子目录上设置 NSURLIsExcludedFromBackupKey 属性。这样子目录中的任何内容,包括隐藏的 SUPPORT 目录,都将从备份中排除。

【讨论】:

以上是关于如何防止备份带有外部文件的 Core Data 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 删除外部存储实体不会释放 iCloud 中的空间

如何防止 Core Data 在 iOS 5 中重复?

如何更新 Core Data 的用户界面?

备份和恢复 Core Data SQLite(核心数据)

如何在Core Data中使用带有fetchRequest的谓词

防止 Core Data 创建空对象