137 lines
3.6 KiB
Swift
137 lines
3.6 KiB
Swift
//: To run this playground:
|
|
//:
|
|
//: - Open GRDB.xcworkspace
|
|
//: - Select the GRDB scheme: menu Product > Scheme > GRDB
|
|
//: - Build: menu Product > Build
|
|
//: - Select the playground in the Playgrounds Group
|
|
//: - Run the playground
|
|
//:
|
|
//: Tour
|
|
//: ======
|
|
//:
|
|
//: This playground is a quick tour of GRDB.
|
|
|
|
import GRDB
|
|
import CoreLocation
|
|
|
|
|
|
//: Open a connection to the database
|
|
|
|
// Open an in-memory database that logs all SQL statements
|
|
var configuration = Configuration()
|
|
configuration.prepareDatabase { db in
|
|
db.trace { print("SQL> \($0)") }
|
|
}
|
|
let dbQueue = try DatabaseQueue(configuration: configuration)
|
|
|
|
|
|
//: Execute SQL queries
|
|
|
|
try dbQueue.inDatabase { db in
|
|
try db.execute(sql: """
|
|
CREATE TABLE place (
|
|
id INTEGER PRIMARY KEY,
|
|
title TEXT,
|
|
favorite BOOLEAN NOT NULL,
|
|
latitude DOUBLE NOT NULL,
|
|
longitude DOUBLE NOT NULL
|
|
)
|
|
""")
|
|
|
|
try db.execute(sql: """
|
|
INSERT INTO place (title, favorite, latitude, longitude)
|
|
VALUES (?, ?, ?, ?)
|
|
""", arguments: ["Paris", true, 48.85341, 2.3488])
|
|
let parisId = db.lastInsertedRowID
|
|
}
|
|
|
|
|
|
//: Fetch database rows and values
|
|
|
|
try! dbQueue.inDatabase { db in
|
|
let rows = try Row.fetchCursor(db, sql: "SELECT * FROM place")
|
|
while let row = try rows.next() {
|
|
let title: String = row["title"]
|
|
let favorite: Bool = row["favorite"]
|
|
let coordinate = CLLocationCoordinate2D(
|
|
latitude: row["latitude"],
|
|
longitude: row["longitude"])
|
|
print("Fetched", title, favorite, coordinate)
|
|
}
|
|
|
|
let placeCount = try Int.fetchOne(db, sql: "SELECT COUNT(*) FROM place")! // Int
|
|
let placeTitles = try String.fetchAll(db, sql: "SELECT title FROM place") // [String]
|
|
}
|
|
|
|
|
|
//: Insert and fetch records
|
|
|
|
struct Place {
|
|
var id: Int64?
|
|
var title: String?
|
|
var favorite: Bool
|
|
var coordinate: CLLocationCoordinate2D
|
|
}
|
|
|
|
// Adopt FetchableRecord
|
|
extension Place : FetchableRecord {
|
|
init(row: Row) {
|
|
id = row["id"]
|
|
title = row["title"]
|
|
favorite = row["favorite"]
|
|
coordinate = CLLocationCoordinate2DMake(
|
|
row["latitude"],
|
|
row["longitude"])
|
|
}
|
|
}
|
|
|
|
// Adopt TableRecord
|
|
extension Place : TableRecord {
|
|
static let databaseTableName = "place"
|
|
}
|
|
|
|
// Adopt MutablePersistableRecord
|
|
extension Place : MutablePersistableRecord {
|
|
func encode(to container: inout PersistenceContainer) throws {
|
|
container["id"] = id
|
|
container["title"] = title
|
|
container["favorite"] = favorite
|
|
container["latitude"] = coordinate.latitude
|
|
container["longitude"] = coordinate.longitude
|
|
}
|
|
|
|
mutating func didInsert(_ inserted: InsertionSuccess) {
|
|
id = inserted.rowID
|
|
}
|
|
}
|
|
|
|
try dbQueue.inDatabase { db in
|
|
var berlin = Place(
|
|
id: nil,
|
|
title: "Berlin",
|
|
favorite: false,
|
|
coordinate: CLLocationCoordinate2DMake(52.52437, 13.41053))
|
|
|
|
try berlin.insert(db)
|
|
berlin.id // some value
|
|
|
|
berlin.favorite = true
|
|
try berlin.update(db)
|
|
|
|
// Fetch from SQL
|
|
let places = try Place.fetchAll(db, sql: "SELECT * FROM place") // [Place]
|
|
|
|
|
|
//: Avoid SQL with the query interface:
|
|
|
|
let title = Column("title")
|
|
let favorite = Column("favorite")
|
|
|
|
berlin = try Place.filter(title == "Berlin").fetchOne(db)! // Place
|
|
let paris = try Place.fetchOne(db, key: 1) // Place?
|
|
let favoritePlaces = try Place // [Place]
|
|
.filter(favorite == true)
|
|
.order(title)
|
|
.fetchAll(db)
|
|
}
|