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 是一個包含在 C 編程庫中的關係數據庫管理系統。 與許多其他數據庫管理系統相比,SQLite 不是客戶端-服務器數據庫引擎。 事實上,它嵌入在客戶端應用程序本身中。 所以 SQLite 不涉及網絡。
在應用程序中使用 SQLite 的最常見目的是可以在數據庫級別進行一些數據讀/寫優化,這是使用 CoreData 無法完成的。 這個話題非常廣泛,所以建議您熟悉以下 SQLite wrapper:https://github.com/groue/GRDB.swift。