質問失礼します。
SQLiteを使用してデータを保存したいと思い、
下記のサイトを参考にGRDBをインポートしてコードを記載したのですが、
SQLiteにデータを保存する為のinsertメソッドが存在しませんという旨のエラーが出てしまいます。
参考にしているサイトを見返しても、insertメソッドがどこで実装されているのか分かりませんでした。
どうすればSQLiteで作成したテーブルにデータを保存出来るのでしょうか。
どなたかご教授いただけますと嬉しいです。
よろしくお願い致します。
・参考サイト
https://qiita.com/unpi/items/5ca166f280aeb732edd9
・ViewController
Swift
1import UIKit 2import GRDB 3 4class ViewController: UIViewController { 5 6 //ラベルを設定する 7 var textLabel :UILabel = { 8 let label = UILabel() 9 label.textColor = .black 10 label.font = UIFont.boldSystemFont(ofSize: 15) 11 label.numberOfLines = 0 12 label.translatesAutoresizingMaskIntoConstraints = false 13 label.textAlignment = .center 14 label.text = "" 15 label.backgroundColor = .orange 16 return label 17 }() 18 19 //ボタンを設定する 20 var button :UIButton = { 21 let btn = UIButton() 22 btn.setTitle("入力", for: .normal) 23 btn.backgroundColor = UIColor.gray 24 btn.tintColor = .white 25 btn.translatesAutoresizingMaskIntoConstraints = false 26 btn.addTarget(self, action: #selector(ViewController.tap(_:)), for: .touchUpInside) 27 return btn 28 }() 29 30 31 override func viewDidLoad() { 32 super.viewDidLoad() 33 //ボタンを表示する 34 view.addSubview(button) 35 //オートレイアウト 36 button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 37 button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 38 button.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.3).isActive = true 39 button.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.1).isActive = true 40 41 //ラベルを表示する 42 view.addSubview(textLabel) 43 //オートレイアウト 44 textLabel.topAnchor.constraint(equalTo: button.bottomAnchor,constant: 20).isActive = true 45 textLabel.centerXAnchor.constraint(equalTo: button.centerXAnchor).isActive = true 46 textLabel.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.5).isActive = true 47 textLabel.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.2).isActive = true 48 49 50 } 51 ///ボタン押下時の挙動 52 @objc func tap(_ sender: UIButton) { 53 //アラートで入力画面を表示 54 let alertController = UIAlertController(title:nil, message:"入力して下さい", preferredStyle: UIAlertController.Style.alert) 55 alertController.addTextField() 56 57 let okButton = UIAlertAction(title: "OK", style: UIAlertAction.Style.default) { (ok) in 58 if let textField = alertController.textFields?.first { 59 //テキストフィールドの文字をSQLに保存したい 60 let helper = DatabaseHelper() 61 helper.inDatabase { (db) in 62 // エンティティを設定 63 var entity = Table(id: 1, 64 comment: textField.text!, 65 date: Date()) 66 67 // Value of type 'Table' has no member 'insert'のエラーが発生してしまう 68 try entity.insert(db) 69 } 70 } 71 } 72 alertController.addAction(okButton) 73 let cancelButton = UIAlertAction(title: "cancel", style: UIAlertAction.Style.cancel, handler:nil) 74 alertController.addAction(cancelButton) 75 //アラートを表示する 76 present(alertController, animated:true, completion: nil) 77 } 78}
・Table作成用クラス
Swift
1import Foundation 2import GRDB 3 4struct Table { 5 6 var id: Int 7 var comment: String 8 var date: Date 9 10 static var databaseTableName: String { 11 return "table_name" // テーブル名 12 } 13//テーブルを作成する 14 static func create(_ db: Database) throws { 15 try db.create(table: databaseTableName, body: { (t: TableDefinition) in 16 t.column("id", .integer).primaryKey(onConflict: .replace, autoincrement: true)//オートインクリメントで自動採番 17 t.column("comment", .text).notNull().unique() // 重複を許さないのなら.unique()をつける 18 t.column("date", .date).notNull() // Nullを許さないのなら.notNull()をつける 19 }) 20 } 21}
・ DBを使用する為のクラス
Swift
1import Foundation 2import GRDB 3//データベースファイルを生成する 4class DatabaseHelper { 5 6 private struct Const { 7 // データベースファイル名 8 static let dbFileName = "application.db" 9 } 10 11 init() { 12 self.creatDatabase() 13 } 14/// データベースの操作 15 func inDatabase(_ block: (Database) throws -> Void) -> Bool { 16 do { 17 // 初回実行時にデータベースファイルを生成する 18 let dbQueue = try DatabaseQueue(path: Const.dbFileName) 19 try dbQueue.inDatabase(block) 20 }catch _ { 21 return false 22 } 23 return true 24 } 25/// データベースの生成処理 26 private func creatDatabase() { 27 // 既にファイルが作成済みなら何もしない 28 if FileManager.default.fileExists(atPath: Const.dbFileName) { 29 return 30 } 31 // テーブルの作成処理 32 let result = inDatabase {(db) in 33 try Table.create(db) 34 // ※複数テーブルがある場合はここに追加する 35 } 36 if !result { 37 do {try FileManager.default.removeItem(atPath: Const.dbFileName)} catch {} 38 } 39 } 40} 41
回答1件
あなたの回答
tips
プレビュー