Skip to content

Instantly share code, notes, and snippets.

@thanhit93
Created November 25, 2021 17:06
Show Gist options
  • Save thanhit93/db03ffc4678e799bd982b84d1493cf0d to your computer and use it in GitHub Desktop.
Save thanhit93/db03ffc4678e799bd982b84d1493cf0d to your computer and use it in GitHub Desktop.
//
// DBHelper.swift
//
import Foundation
import SQLite3
class DBHelper
{
init()
{
db = openDatabase()
createTable()
}
let dbPath: String = "mountain_bio.sqlite"
var db:OpaquePointer?
func openDatabase() -> OpaquePointer?
{
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent(dbPath)
var db: OpaquePointer? = nil
if sqlite3_open(fileURL.path, &db) != SQLITE_OK
{
print("error opening database")
return nil
}
else
{
print("Successfully opened connection to database at \(dbPath)")
return db
}
}
func createTable() {
let createTableString = "CREATE TABLE IF NOT EXISTS user(email TEXT PRIMARY KEY,mb_id TEXT);"
var createTableStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, createTableString, -1, &createTableStatement, nil) == SQLITE_OK
{
if sqlite3_step(createTableStatement) == SQLITE_DONE
{
print("user table created.")
} else {
print("user table could not be created.")
}
} else {
print("CREATE TABLE statement could not be prepared.")
}
sqlite3_finalize(createTableStatement)
}
func insert(id:Int, name:String, age:Int)
{
let persons = readUsers()
for p in persons
{
if p.id == id
{
return
}
}
let insertStatementString = "INSERT INTO person (Id, name, age) VALUES (?, ?, ?);"
var insertStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
sqlite3_bind_int(insertStatement, 1, Int32(id))
sqlite3_bind_text(insertStatement, 2, (name as NSString).utf8String, -1, nil)
sqlite3_bind_int(insertStatement, 3, Int32(age))
if sqlite3_step(insertStatement) == SQLITE_DONE {
print("Successfully inserted row.")
} else {
print("Could not insert row.")
}
} else {
print("INSERT statement could not be prepared.")
}
sqlite3_finalize(insertStatement)
}
func readUsers() -> [User] {
let queryStatementString = "SELECT * FROM person;"
var queryStatement: OpaquePointer? = nil
var psns : [User] = []
if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
while sqlite3_step(queryStatement) == SQLITE_ROW {
// let id = sqlite3_column_int(queryStatement, 0)
let email = String(describing: String(cString: sqlite3_column_text(queryStatement, 0)))
let mbId = String(describing: String(cString: sqlite3_column_text(queryStatement, 1)))
//psns.append(User(email: email))
print("Query Result:")
}
} else {
print("SELECT statement could not be prepared")
}
sqlite3_finalize(queryStatement)
return psns
}
func deleteByID(id:Int) {
let deleteStatementStirng = "DELETE FROM person WHERE Id = ?;"
var deleteStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, deleteStatementStirng, -1, &deleteStatement, nil) == SQLITE_OK {
sqlite3_bind_int(deleteStatement, 1, Int32(id))
if sqlite3_step(deleteStatement) == SQLITE_DONE {
print("Successfully deleted row.")
} else {
print("Could not delete row.")
}
} else {
print("DELETE statement could not be prepared")
}
sqlite3_finalize(deleteStatement)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment