FetchableRecord
public protocol FetchableRecord
Types that adopt FetchableRecord can be initialized from a database Row.
let row = try Row.fetchOne(db, "SELECT ...")!
let player = Player(row)
The protocol comes with built-in methods that allow to fetch cursors, arrays, or single records:
try Player.fetchCursor(db, "SELECT ...", arguments:...) // Cursor of Player
try Player.fetchAll(db, "SELECT ...", arguments:...) // [Player]
try Player.fetchOne(db, "SELECT ...", arguments:...) // Player?
let statement = try db.makeSelectStatement("SELECT ...")
try Player.fetchCursor(statement, arguments:...) // Cursor of Player
try Player.fetchAll(statement, arguments:...) // [Player]
try Player.fetchOne(statement, arguments:...) // Player?
FetchableRecord is adopted by Record.
-
init(row:)Default implementationCreates a record from
row.For performance reasons, the row argument may be reused during the iteration of a fetch query. If you want to keep the row for later use, make sure to store a copy:
self.row = row.copy().Default Implementation
Declaration
Swift
init(row: Row)
-
databaseDecodingUserInfoDefault implementationWhen the FetchableRecord type also adopts the standard Decodable protocol, you can use this dictionary to customize the decoding process from database rows.
For example:
// A key that holds a decoder's name let decoderName = CodingUserInfoKey(rawValue: "decoderName")! // A FetchableRecord + Decodable record struct Player: FetchableRecord, Decodable { // Customize the decoder name when decoding a database row static let databaseDecodingUserInfo: [CodingUserInfoKey: Any] = [decoderName: "Database"] init(from decoder: Decoder) throws { // Print the decoder name print(decoder.userInfo[decoderName]) ... } } // prints "Database" let player = try Player.fetchOne(db, ...) // prints "JSON" let decoder = JSONDecoder() decoder.userInfo = [decoderName: "JSON"] let player = try decoder.decode(Player.self, from: ...)Default Implementation
Declaration
Swift
static var databaseDecodingUserInfo: [CodingUserInfoKey : Any] { get } -
databaseJSONDecoder(for:)Default implementationWhen the FetchableRecord type also adopts the standard Decodable protocol, this method controls the decoding process of nested properties from JSON database columns.
The default implementation returns a JSONDecoder with the following properties:
- dataDecodingStrategy: .base64
- dateDecodingStrategy: .millisecondsSince1970
- nonConformingFloatDecodingStrategy: .throw
You can override those defaults:
struct Achievement: Decodable { var name: String var date: Date } struct Player: Decodable, FetchableRecord { // stored in a JSON column var achievements: [Achievement] static func databaseJSONDecoder(for column: String) -> JSONDecoder { let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 return decoder } }Default Implementation
Returns a JSONDecoder with the following properties:
- dataDecodingStrategy: .base64
- dateDecodingStrategy: .millisecondsSince1970
- nonConformingFloatDecodingStrategy: .throw
Declaration
Swift
static func databaseJSONDecoder(for column: String) -> JSONDecoder -
databaseDateDecodingStrategyDefault implementationWhen the FetchableRecord type also adopts the standard Decodable protocol, this property controls the decoding of date properties.
Default value is .deferredToDate
For example:
struct Player: FetchableRecord, Decodable { static let databaseDateDecodingStrategy: DatabaseDateDecodingStrategy = .timeIntervalSince1970 var name: String var registrationDate: Date // decoded from epoch timestamp }Default Implementation
Declaration
Swift
static var databaseDateDecodingStrategy: DatabaseDateDecodingStrategy { get }
-
fetchCursor(_:)Extension methodA cursor over all records fetched from the database.
// SELECT * FROM player let players = try Player.fetchCursor(db) // Cursor of Player while let player = try players.next() { // Player ... }Records are iterated in the natural ordering of the table.
If the database is modified during the cursor iteration, the remaining elements are undefined.
The cursor must be iterated in a protected dispath queue.
The selection defaults to all columns. This default can be changed for all requests by the
TableRecord.databaseSelectionproperty, or for individual requests with theTableRecord.selectmethod.Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchCursor(_ db: Database) throws -> RecordCursor<Self>Parameters
dbA database connection.
Return Value
A cursor over fetched records.
-
fetchAll(_:)Extension methodAn array of all records fetched from the database.
// SELECT * FROM player let players = try Player.fetchAll(db) // [Player]The selection defaults to all columns. This default can be changed for all requests by the
TableRecord.databaseSelectionproperty, or for individual requests with theTableRecord.selectmethod.Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchAll(_ db: Database) throws -> [Self]Parameters
dbA database connection.
-
fetchOne(_:)Extension methodThe first found record.
// SELECT * FROM player let player = try Player.fetchOne(db) // Player?The selection defaults to all columns. This default can be changed for all requests by the
TableRecord.databaseSelectionproperty, or for individual requests with theTableRecord.selectmethod.Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchOne(_ db: Database) throws -> Self?Parameters
dbA database connection.
-
fetchCursor(_:keys:)Extension methodReturns a cursor over records, given their primary keys.
let players = try Player.fetchCursor(db, keys: [1, 2, 3]) // Cursor of Player while let player = try players.next() { // Player ... }Records are iterated in unspecified order.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchCursor<Sequence>(_ db: Database, keys: Sequence) throws -> RecordCursor<Self> where Sequence : Sequence, Sequence.Element : DatabaseValueConvertibleParameters
dbA database connection.
keysA sequence of primary keys.
Return Value
A cursor over fetched records.
-
fetchAll(_:keys:)Extension methodReturns an array of records, given their primary keys.
let players = try Player.fetchAll(db, keys: [1, 2, 3]) // [Player]The order of records in the returned array is undefined.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchAll<Sequence>(_ db: Database, keys: Sequence) throws -> [Self] where Sequence : Sequence, Sequence.Element : DatabaseValueConvertibleParameters
dbA database connection.
keysA sequence of primary keys.
Return Value
An array of records.
-
fetchOne(_:key:)Extension methodReturns a single record given its primary key.
let player = try Player.fetchOne(db, key: 123) // Player?Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchOne<PrimaryKeyType>(_ db: Database, key: PrimaryKeyType?) throws -> Self? where PrimaryKeyType : DatabaseValueConvertibleParameters
dbA database connection.
keyA primary key value.
Return Value
An optional record.
-
fetchCursor(_:keys:)Extension methodReturns a cursor over records identified by the provided unique keys (primary key or any key with a unique index on it).
let players = try Player.fetchCursor(db, keys: [["email": "a@example.com"], ["email": "b@example.com"]]) // Cursor of Player while let player = try players.next() { // Player ... }Records are iterated in unspecified order.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchCursor(_ db: Database, keys: [[String : DatabaseValueConvertible?]]) throws -> RecordCursor<Self>Parameters
dbA database connection.
keysAn array of key dictionaries.
Return Value
A cursor over fetched records.
-
fetchAll(_:keys:)Extension methodReturns an array of records identified by the provided unique keys (primary key or any key with a unique index on it).
let players = try Player.fetchAll(db, keys: [["email": "a@example.com"], ["email": "b@example.com"]]) // [Player]The order of records in the returned array is undefined.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchAll(_ db: Database, keys: [[String : DatabaseValueConvertible?]]) throws -> [Self]Parameters
dbA database connection.
keysAn array of key dictionaries.
Return Value
An array of records.
-
fetchOne(_:key:)Extension methodReturns a single record identified by a unique key (the primary key or any key with a unique index on it).
let player = try Player.fetchOne(db, key: ["name": Arthur"]) // Player?Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchOne(_ db: Database, key: [String : DatabaseValueConvertible?]?) throws -> Self?Parameters
dbA database connection.
keyA dictionary of values.
Return Value
An optional record.
-
fetchCursor(_:arguments:adapter:)Extension methodA cursor over records fetched from a prepared statement.
let statement = try db.makeSelectStatement("SELECT * FROM player") let players = try Player.fetchCursor(statement) // Cursor of Player while let player = try players.next() { // Player ... }If the database is modified during the cursor iteration, the remaining elements are undefined.
The cursor must be iterated in a protected dispath queue.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchCursor(_ statement: SelectStatement, arguments: StatementArguments? = nil, adapter: RowAdapter? = nil) throws -> RecordCursor<Self>Parameters
statementThe statement to run.
argumentsOptional statement arguments.
adapterOptional RowAdapter
Return Value
A cursor over fetched records.
-
fetchAll(_:arguments:adapter:)Extension methodReturns an array of records fetched from a prepared statement.
let statement = try db.makeSelectStatement("SELECT * FROM player") let players = try Player.fetchAll(statement) // [Player]Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchAll(_ statement: SelectStatement, arguments: StatementArguments? = nil, adapter: RowAdapter? = nil) throws -> [Self]Parameters
statementThe statement to run.
argumentsOptional statement arguments.
adapterOptional RowAdapter
Return Value
An array of records.
-
fetchOne(_:arguments:adapter:)Extension methodReturns a single record fetched from a prepared statement.
let statement = try db.makeSelectStatement("SELECT * FROM player") let player = try Player.fetchOne(statement) // Player?Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchOne(_ statement: SelectStatement, arguments: StatementArguments? = nil, adapter: RowAdapter? = nil) throws -> Self?Parameters
statementThe statement to run.
argumentsOptional statement arguments.
adapterOptional RowAdapter
Return Value
An optional record.
-
fetchCursor(_:_:arguments:adapter:)Extension methodReturns a cursor over records fetched from an SQL query.
let players = try Player.fetchCursor(db, "SELECT * FROM player") // Cursor of Player while let player = try players.next() { // Player ... }If the database is modified during the cursor iteration, the remaining elements are undefined.
The cursor must be iterated in a protected dispath queue.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchCursor(_ db: Database, _ sql: String, arguments: StatementArguments? = nil, adapter: RowAdapter? = nil) throws -> RecordCursor<Self>Parameters
dbA database connection.
sqlAn SQL query.
argumentsOptional statement arguments.
adapterOptional RowAdapter
Return Value
A cursor over fetched records.
-
fetchAll(_:_:arguments:adapter:)Extension methodReturns an array of records fetched from an SQL query.
let players = try Player.fetchAll(db, "SELECT * FROM player") // [Player]Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchAll(_ db: Database, _ sql: String, arguments: StatementArguments? = nil, adapter: RowAdapter? = nil) throws -> [Self]Parameters
dbA database connection.
sqlAn SQL query.
argumentsOptional statement arguments.
adapterOptional RowAdapter
Return Value
An array of records.
-
fetchOne(_:_:arguments:adapter:)Extension methodReturns a single record fetched from an SQL query.
let player = try Player.fetchOne(db, "SELECT * FROM player") // Player?Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchOne(_ db: Database, _ sql: String, arguments: StatementArguments? = nil, adapter: RowAdapter? = nil) throws -> Self?Parameters
dbA database connection.
sqlAn SQL query.
argumentsOptional statement arguments.
adapterOptional RowAdapter
Return Value
An optional record.
-
fetchCursor(_:_:)Extension methodReturns a cursor over records fetched from a fetch request.
let request = try Player.all() let players = try Player.fetchCursor(db, request) // Cursor of Player while let player = try players.next() { // Player ... }If the database is modified during the cursor iteration, the remaining elements are undefined.
The cursor must be iterated in a protected dispath queue.
Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchCursor<R>(_ db: Database, _ request: R) throws -> RecordCursor<Self> where R : FetchRequestParameters
dbA database connection.
sqla FetchRequest.
Return Value
A cursor over fetched records.
-
fetchAll(_:_:)Extension methodReturns an array of records fetched from a fetch request.
let request = try Player.all() let players = try Player.fetchAll(db, request) // [Player]Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchAll<R>(_ db: Database, _ request: R) throws -> [Self] where R : FetchRequestParameters
dbA database connection.
sqla FetchRequest.
Return Value
An array of records.
-
fetchOne(_:_:)Extension methodReturns a single record fetched from a fetch request.
let request = try Player.filter(key: 1) let player = try Player.fetchOne(db, request) // Player?Throws
A DatabaseError is thrown whenever an SQLite error occurs.Declaration
Swift
public static func fetchOne<R>(_ db: Database, _ request: R) throws -> Self? where R : FetchRequestParameters
dbA database connection.
sqla FetchRequest.
Return Value
An optional record.
View on GitHub
Install in Dash
FetchableRecord Protocol Reference