iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Software Development

iOS 學習筆記系列 第 27

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。


上一篇
Day26 Data Storage in iOS 02 - Keychain & Property list (Plists)
下一篇
Day28 Data Storage in iOS 04 - Core Data 簡介
系列文
iOS 學習筆記30

尚未有邦友留言

立即登入留言