← Back to Tutorials

8. Storage & Data Persistence

Storage & Data

UserDefaults

Store small key-value data like user preferences:

// Save
UserDefaults.standard.set("John", forKey: "username")
UserDefaults.standard.set(true, forKey: "isLoggedIn")
UserDefaults.standard.synchronize()

// Load
let username = UserDefaults.standard.string(forKey: "username") ?? ""
let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")

Core Data

Apple's object graph and persistence framework for complex data models:

// Fetch all users
let fetchRequest: NSFetchRequest<User> = User.fetchRequest()
do {
    let users = try context.fetch(fetchRequest)
    print("Found \(users.count) users")
} catch {
    print("Fetch failed: \(error)")
}

// Create a new user
let user = User(context: context)
user.name = "Alice"
user.age = 30

// Save
do {
    try context.save()
} catch {
    print("Save error: \(error)")
}

SQLite with FMDB/GRDB

Lightweight relational database storage (third-party libraries):

// GRDB example
import GRDB

let dbQueue = try DatabaseQueue(path: "/path/to/database.sqlite")
try dbQueue.write { db in
    try db.execute(sql: "CREATE TABLE IF NOT EXISTS items (" +
        "id INTEGER PRIMARY KEY, name TEXT)")
    try db.execute(sql: "INSERT INTO items (name) VALUES (?)",
        arguments: ["Sample Item"])
}
let items = try dbQueue.read { db in
    try Row.fetchAll(db, sql: "SELECT * FROM items")
}

File Manager

Read/write files in the app's sandbox:

let fileManager = FileManager.default
let documentsURL = try fileManager.url(for: .documentDirectory,
    in: .userDomainMask, appropriateFor: nil, create: false)

let fileURL = documentsURL.appendingPathComponent("data.txt")

// Write
try "Hello, iOS!".write(to: fileURL, atomically: true,
    encoding: .utf8)

// Read
let content = try String(contentsOf: fileURL, encoding: .utf8)

CloudKit

Apple's cloud storage service for syncing data across devices:

import CloudKit

let container = CKContainer.default()
let database = container.privateCloudDatabase

let record = CKRecord(recordType: "Note")
record["title"] = "My Cloud Note"
record["content"] = "This syncs across devices!"

database.save(record) { savedRecord, error in
    if error == nil {
        print("Saved to iCloud!")
    }
}
Practice Task: Create a "Notes" app that allows creating, editing, and deleting notes. Use Core Data for local persistence. Add a "Sync to iCloud" button that uploads notes using CloudKit. Store the last opened note's ID in UserDefaults.