Day27 Data Storage in iOS 03 - File System & Sqlite

File System

Apple 让iOS 应用程序内的文件编写、阅读和编辑变得非常容易。每个应用程序都有一个sandbox directory(称为文档目录),你可以在那里存储你的文件。 FileManager 物件用非常简单的API提供这些功能。

文件可以存储在你的应用程序的Document目录的目录和子目录中。这就是为什麽Apple 推荐使用URL 来指定和处理使用FileManager 物件。

URL类,一般来说,在与网路合作时使用,如API请求和打开网站。这种用例需要为每个要创建的URL添加https:// 前缀。对於文件,Apple 要求使用 "file://"前缀,这使得Apple 能够检测你是否使用了正确的文件URL。

  • func makeURL(forFileNamed fileName: String) -> URL? :

    该方法负责创建具有给定名称的文件的 URL。 如前所述,我们只能使用 .userDomainMask 写入文档目录。

  • fileManager.fileExists(atPath: url.absoluteString):

    如果文件已经存在,则返回 true。 我们可能不希望覆盖该文件,但这取决於您的用例。

范例:

class FilesManager {
    enum Error: Swift.Error {
        case fileAlreadyExists
        case invalidDirectory
        case writtingFailed
    }
    let fileManager: FileManager
    init(fileManager: FileManager = .default) {
        self.fileManager = fileManager
    }
    func save(fileNamed: String, data: Data) throws {
        guard let url = makeURL(forFileNamed: fileNamed) else {
            throw Error.invalidDirectory
        }
        if fileManager.fileExists(atPath: url.absoluteString) {
            throw Error.fileAlreadyExists
        }
        do {
            try data.write(to: url)
        } catch {
            debugPrint(error)
            throw Error.writtingFailed
        }
    }
    private func makeURL(forFileNamed fileName: String) -> URL? {
        guard let url = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else {
            return nil
        }
        return url.appendingPathComponent(fileName)
    }
    
}

现在我们确定可以保存文件,我们应该使用 Data 对象方法 write(to url: URL, options: Data.WritingOptions) throws 将文件存储在指定的 URL 下。

func read(fileNamed: String) throws -> Data {
       guard let url = makeURL(forFileNamed: fileNamed) else {
           throw Error.invalidDirectory
       }
       guard fileManager.fileExists(atPath: url.absoluteString) else {
           throw Error.fileNotExists
       }
       do {
           return try Data(contentsOf: url)
       } catch {
           debugPrint(error)
           throw Error.readingFailed
       }
   }

文件系统非常适合存储我们从 Web 下载的图像,并希望方便地减少加载时间。 在这种情况下,我们可以使用 Library/Caches 文件夹。
我们可以在 Library 文件夹中创建一个文件来存储我们的应用程序的状态

Sqlite

SQLite 是一个包含在 C 编程库中的关系数据库管理系统。 与许多其他数据库管理系统相比,SQLite 不是客户端-服务器数据库引擎。 事实上,它嵌入在客户端应用程序本身中。 所以 SQLite 不涉及网络。

在应用程序中使用 SQLite 的最常见目的是可以在数据库级别进行一些数据读/写优化,这是使用 CoreData 无法完成的。 这个话题非常广泛,所以建议您熟悉以下 SQLite wrapper:https://github.com/groue/GRDB.swift。


<<:  Day27 Plugin 从零开始到上架 - iOS instagram APIs

>>:  [Day 30] Reactive Programming - 感想

JavaScript入门 Day07_如何使用字串2

今天呢,来讲讲其他有关字串的用法~ 若是我们今天想知道这个字串的第几个字是什麽 那摸 我们就可以使用...

[DAY 29] Google 提供的图片转文字

现在有一些还不错的网站有在蒐集各校段考考古题 例如:全国中小学题库网、昌爸工作坊 等等 由於我国着作...

Day12 - 解析图片中的 QR Code 资料

前言 前篇讲解如何产二维条码 QR Code,这篇则是示范如何解析(解码) QR Code,类似工具...

D10 - 彭彭的课程#Python 流程控制:回圈基础,while 回圈、for 回圈

假日发一波真的是令人感动 其实我在看这课程的时候都放两倍速听 刚好友人来玩经过我位置居然跟我说在听什...

【Day 18】今日 git 小复习

对於其他人没什麽用的我的 git cheatsheet。 感觉还是要有情境呢.. git log ...