iOS:防止 .cacheDirectory 中的文件在存储空间已满警告时被删除

标签 ios file swift3 storage sqlite.swift

我的问题: 我在缓存目录中有我的 SQLite 数据库文件,并将 isExcludedFromBackup 设置为 true 因为我读到,这样做会防止 iOS 系统在存储空间满的情况下删除它。但它仍然被删除。这是在使用 iOS 10.3.3 的真实设备 iPhone 5s 的开发中观察到的。

SQLite 数据库文件是由 SQLite.swift API 创建的,这可能很重要但不是必须的原因。 https://github.com/StephenCelis/SQLite.swift

使用 SQLite.swift 创建文件:

    let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!
    let databaseName = "name.extension"
    let filePath = "\(path)/\(databaseName)"
    self.db = try! Connection(filePath) // creates the file, if it does not exists

设置 isExcludedFromBackup 标志:

func excludeSQLiteFileFromBackup(path: String) {
    let exists = FileManager.default.fileExists(atPath: path)
    if !exists {
        MyLogger.log("excludeSQLiteFileFromBackup: file not created yet.", aClass: self.classForCoder)
        return
    }

    var url = URL(fileURLWithPath: path)
    do {
        var resourceValues = URLResourceValues()
        resourceValues.isExcludedFromBackup = true
        try url.setResourceValues(resourceValues)
    } catch let error as NSError {
        MyLogger.log("excludeSQLiteFileFromBackup: \(error)", aClass: self.classForCoder)
    }
}

这是使用相同的文件路径调用的,该文件路径在第一个代码块中提供给连接。我还通过在将该文件设置为 true 之前和之后从该文件中获取 ResourceValues 来检查该标志是否设置正确,并且它正确地获得了更改。

因为它是离线使用所必需的,所以符合商店指南应该没问题。

问题:

  1. 是否正确,即 isExcludedFromBackup 阻止 iOS 系统删除文件?
  2. 如果不是,我怎样才能防止系统删除它?由于指南,我认为我不能将文件存储在 .documentsDirectory 中,而且我不知道应该使用哪个目录。我更喜欢不需要重新定位数据库文件的解决方案。
  3. 如果是 (@1.) 为什么它在我的情况下不起作用,我该如何解决?

最佳答案

1) 不是,isExcludedFromBackup = true 意思是当用户备份他的手机时,这个文件不会被包含,我不知道你为什么认为它不会被删除。

2) 解决问题的正确方法是将数据库迁移到 Documents 目录,您无法控制缓存目录,iOS 会在需要时清除它。

关于iOS:防止 .cacheDirectory 中的文件在存储空间已满警告时被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48749185/

相关文章:

ios - 设置值 Firebase - Swift 3

swift - UIButton 的阴影模糊了按钮图像

Java将xml文件内容存储到字符串中

ios - UITextField 获得焦点,然后由于在 textFieldShouldReturn 中返回 YES 而立即失去焦点

ios - 在 iOS 通知内容扩展中关闭键盘

iphone - 如何让我的 UIPickerView 显示数组的所有元素

java - nio.file 中默认的 StandardOpenOptions 是什么?

c++ - 从文本文件输入获取char C++

ios - 如何在 Swift 4 中应用程序处于运行状态时显示推送通知?

ios - NavigationBar 标题没有出现