Codable Support

SQLite.swift integrates with Swift's Codable protocols (introduced in Swift 4) to allow for easy serialization and deserialization of your custom types to and from the database.

Inserting Codable Types

You can directly insert any Encodable object into a table. SQLite.swift will map the object's properties to columns with matching names.

struct User: Codable {
    let id: Int64
    let name: String
    let email: String
}

let users = Table("users")

let alice = User(id: 1, name: "Alice", email: "alice@example.com")

try db.run(users.insert(alice))
// INSERT INTO "users" ("id", "name", "email") VALUES (1, 'Alice', 'alice@example.com')

The insert method for Encodable types also supports OnConflict resolution and additional setters.

Updating Codable Types

Similarly, you can update a database row by passing a Codable object to the update method. This is typically used with a filter.

let updatedAlice = User(id: 1, name: "Alice L.", email: "alice.l@example.com")

try db.run(users.filter(id == 1).update(updatedAlice))
// UPDATE "users" SET "id" = 1, "name" = 'Alice L.', "email" = 'alice.l@example.com' 
// WHERE ("id" = 1)

Calling update with a Codable object on an unfiltered query will update all rows in the table.

Retrieving Codable Types

To decode a database row back into your custom Decodable type, use the decode() method on a Row object. This is often used with map on a query result.

let query = users.filter(id == 1)

let userArray: [User] = try db.prepare(query).map { row in
    return try row.decode()
}

if let alice = userArray.first {
    print(alice.name) // "Alice L."
}

Restrictions and Advanced Usage

  • Supported Property Types: The default Codable implementation supports basic types (Int, Bool, String, Double, Date, Data, UUID) and their optional variants.
  • Nested Objects: Nested Codable objects will be encoded as a JSON string into a single TEXT column.
  • Relationships: The default implementation does not handle database relationships (e.g., foreign keys). To support this, you must write a custom Codable implementation that manually encodes/decodes the relevant IDs.
  • Limitations: The implementation does not support nested containers, single-value containers, or super decoders/encoders from the Codable API.