質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3222閲覧

SQLiteを使用してデータを保存したい

Ka_ya_

総合スコア31

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/06/03 11:04

質問失礼します。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/06/03 12:12 編集

参考にされた記事では UserTable の定義は struct UserTable : Codable, RowConvertible, MutablePersistable { になっていたので、Table の定義を同様に変更してみましたがエラーになりました。GRDB というライブラリは頻繁に更新されているようで、2 年前の記事はだいぶ古くなっているようですね。 こちらの記事の方が新しいですが、それでも 1 年前…。(なお、GRDB のインストールは CocoaPods を使うのが簡単だと思います。) https://qiita.com/Cyber_Hacnosuke/items/033da2b2e9cfbee7fff0 とりあえずこちらにサンプルがあるので、これを参考にするのが一番確実では。 https://github.com/groue/GRDB.swift/blob/master/Documentation/DemoApps/GRDBDemoiOS/README.md
Ka_ya_

2020/06/04 01:47

ご回答ありがとうございます。 サンプルや公式を確認すると、色々使い方があるみたいですね。 記載方法が沢山あってなかなか難しそうなので、 SQLを分かりやすく使える方法をもう少し調べてみようと思います。
guest

回答1

0

自己解決

下記サイトを参考にSQLiteを使用しました。
https://www.simplifiedios.net/swift-sqlite-tutorial/

投稿2020/06/09 03:51

Ka_ya_

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問