SwiftでSQLiteを使う
import SQLite3
〜
class ViewController〜
var db: OpaquePointer?
let dbName : String = "your_database_name.db"
let tableName = "main_table_name"
〜
override func viewDidLoad() {
〜
// データベースファイルのパスを取得
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent(dbName)
// データベースを開く
if sqlite3_open(fileURL.path, &db) != SQLITE_OK {
print("データベースを開けませんでした。")
return
}
// テーブルの作成
if !tableExists(tableName: tableName) {
let createTableQuery = "CREATE TABLE \(tableName) (_id INTEGER PRIMARY KEY AUTOINCREMENT, 〜 memo TEXT);"
if sqlite3_exec(db, createTableQuery, nil, nil, nil) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("テーブルを作成できませんでした。エラー: \(errmsg)")
return
}
print("テーブルを作成")
} else {
print("テーブルは作成済み")
}
〜
} ←viewDidLoad()の対応カッコ
// テーブル有無チェック
func tableExists(tableName: String) -> Bool {
let query = "SELECT name FROM sqlite_master WHERE type='table' AND name='\(tableName)';"
var statement: OpaquePointer?
sqlite3_prepare_v2(db, query, -1, &statement, nil)
let result = sqlite3_step(statement)
sqlite3_finalize(statement)
return result == SQLITE_ROW
}
// データ挿入
func insertData() {
let insertQuery = "INSERT INTO \(tableName) (〜,memo) VALUES (〜, ?);"
var statement: OpaquePointer?
if sqlite3_prepare_v2(db, insertQuery, -1, &statement, nil) == SQLITE_OK {
let b〜
let memo = "This is a memo"
sqlite3_bind_text(statement, 1, (b〜 as NSString).utf8String, -1, nil)
〜
sqlite3_bind_text(statement, 8, (memo as NSString).utf8String, -1, nil)
if sqlite3_step(statement) == SQLITE_DONE {
print("データの挿入に成功しました。")
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("データの挿入に失敗しました。エラー: \(errmsg)")
}
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("ステートメントの作成に失敗しました。エラー: \(errmsg)")
}
sqlite3_finalize(statement)
}
// 全件表示
func displayData() {
let selectQuery = "SELECT * FROM \(tableName);"
var statement: OpaquePointer?
if sqlite3_prepare_v2(db, selectQuery, -1, &statement, nil) == SQLITE_OK {
while sqlite3_step(statement) == SQLITE_ROW {
let id = sqlite3_column_int(statement, 0)
let b〜
let memo = String(cString: sqlite3_column_text(statement, 8))
print("ID: \(id), B〜, Memo: \(memo)")
}
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("データの取得に失敗しました。エラー: \(errmsg)")
}
sqlite3_finalize(statement)
}
// 検索
func searchData() {
let searchQuery = "SELECT * FROM \(tableName) WHERE key = ?;"
var statement: OpaquePointer?
if sqlite3_prepare_v2(db, searchQuery, -1, &statement, nil) == SQLITE_OK {
let searchKey = "文字列"
sqlite3_bind_text(statement, 1, (searchKey as NSString).utf8String, -1, nil)
while sqlite3_step(statement) == SQLITE_ROW {
let id = sqlite3_column_int(statement, 0)
let b〜
〜
let memo = String(cString: sqlite3_column_text(statement, 8))
print("ID: \(id), B〜, Memo: \(memo)")
}
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("データの検索に失敗しました。エラー: \(errmsg)")
}
sqlite3_finalize(statement)
}
// 更新
func updateData() {
let updateQuery = "UPDATE \(tableName) SET name = ? WHERE key = ?;"
var statement: OpaquePointer?
if sqlite3_prepare_v2(db, updateQuery, -1, &statement, nil) == SQLITE_OK {
let newName = "New Brand Name"
let targetKey = "400000004"
sqlite3_bind_text(statement, 1, (newName as NSString).utf8String, -1, nil)
sqlite3_bind_text(statement, 2, (targetKey as NSString).utf8String, -1, nil)
if sqlite3_step(statement) == SQLITE_DONE {
print("データの更新に成功しました。")
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("データの更新に失敗しました。エラー: \(errmsg)")
}
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("ステートメントの作成に失敗しました。エラー: \(errmsg)")
}
sqlite3_finalize(statement)
}
// 削除
func deleteData() {
let deleteQuery = "DELETE FROM \(tableName) WHERE key = ?;"
var statement: OpaquePointer?
if sqlite3_prepare_v2(db, deleteQuery, -1, &statement, nil) == SQLITE_OK {
let targetKey = "文字列"
sqlite3_bind_text(statement, 1, (targetKey as NSString).utf8String, -1, nil)
if sqlite3_step(statement) == SQLITE_DONE {
print("データの削除に成功しました。")
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("データの削除に失敗しました。エラー: \(errmsg)")
}
} else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("ステートメントの作成に失敗しました。エラー: \(errmsg)")
}
sqlite3_finalize(statement)
}