質問失礼します。
下記サイトを参考にコードを記載してSQLiteへデータ保存をしたのですが、
現状のコードではTEXTが下記の様に違う値で保存されてしまいます。
・テキストフィールドに入力した文字→eventTextカラムに保存される文字列
「a」→「2」
「あ」→「202」
「あいう」→「20200101」
「あいうえお」→「20200101」
どうやらeventTextの後に処理を記載しているselectDayの文字列「20200101」が、
入力した文字数に対応する長さでeventTextカラムに保存されてしまっているようです。
(dateカラムにはselectDayが常に正しく保存されています)
どうすればそれぞれのTEXTを正しく保存出来るのか、
どなたかご教授いただけますと嬉しいです。
よろしくお願いいたします。
・参考サイト
https://www.simplifiedios.net/swift-sqlite-tutorial/
・保存が失敗するコード
Swift
1import UIKit 2import SQLite3 3 4class ViewController: UIViewController { 5 6 var db: OpaquePointer? 7 var eventList = [Event]() 8 9 //ボタンを設定する 10 var button :UIButton = { 11 let btn = UIButton() 12 btn.setTitle("入力", for: .normal) 13 btn.backgroundColor = UIColor.gray 14 btn.tintColor = .white 15 btn.translatesAutoresizingMaskIntoConstraints = false 16 btn.addTarget(self, action: #selector(ViewController.tap(_:)), for: .touchUpInside) 17 return btn 18 }() 19 20 21 override func viewDidLoad() { 22 super.viewDidLoad() 23 //ボタンを表示する 24 view.addSubview(button) 25 //オートレイアウト 26 button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 27 button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 28 button.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.3).isActive = true 29 button.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.1).isActive = true 30 31 //データベースのパス 32 let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) 33 .appendingPathComponent("TestDatabase.sqlite") 34 35 //データベースを開く 36 if sqlite3_open(fileURL.path, &db) != SQLITE_OK { 37 print("error opening database") 38 } 39 40 //テーブルの作成 41 if sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS TestData (eventText TEXT, date TEXT)", nil, nil, nil) != SQLITE_OK { 42 let errmsg = String(cString: sqlite3_errmsg(db)!) 43 print("error creating table: (errmsg)") 44 } 45 46 } 47 ///ボタン押下時の挙動 48 @objc func tap(_ sender: UIButton) { 49 //アラートで入力画面を表示 50 let alertController = UIAlertController(title:nil, message:"入力して下さい", preferredStyle: UIAlertController.Style.alert) 51 alertController.addTextField() 52 53 let okButton = UIAlertAction(title: "OK", style: UIAlertAction.Style.default) { (ok) in 54 //テキストフィールドの文字をSQLに保存する 55 if let textField = alertController.textFields?.first { 56 ///保存するテキストフィールドのテキスト 57 let eventText :String = textField.text ?? "" 58 ///保存する日付 59 let selectDay :String = "20200101" 60 61 var stmt: OpaquePointer? 62 ///保存用SQL文の作成 63 let queryString = "INSERT INTO TestData (eventText, date) VALUES (?,?)" 64 65 //ここでsqlを送信する 66 if sqlite3_prepare(self.db, queryString, -1, &stmt, nil) != SQLITE_OK{ 67 let errmsg = String(cString: sqlite3_errmsg(self.db)!) 68 print("error preparing insert: (errmsg)") 69 return 70 } 71 //一つ目の?に値を設定する 72 if sqlite3_bind_text(stmt, 1, eventText, -1, nil) != SQLITE_OK{ 73 let errmsg = String(cString: sqlite3_errmsg(self.db)!) 74 print("failure binding name: (errmsg)") 75 return 76 } 77 78 //二つ目の?に値を設定する 79 if sqlite3_bind_text(stmt, 2, selectDay, -1, nil) != SQLITE_OK{ 80 let errmsg = String(cString: sqlite3_errmsg(self.db)!) 81 print("failure binding name: (errmsg)") 82 return 83 } 84 85 //実行時エラーの処理 86 if sqlite3_step(stmt) != SQLITE_DONE { 87 let errmsg = String(cString: sqlite3_errmsg(self.db)!) 88 print("failure inserting hero: (errmsg)") 89 return 90 } 91 92 self.readValues() 93 94 print("Herro saved successfully") 95 96 } 97 } 98 alertController.addAction(okButton) 99 let cancelButton = UIAlertAction(title: "cancel", style: UIAlertAction.Style.cancel, handler:nil) 100 alertController.addAction(cancelButton) 101 //アラートを表示する 102 present(alertController, animated:true, completion: nil) 103 } 104 ///SQLから値を取得する 105 func readValues(){ 106 //配列を空にする 107 eventList.removeAll() 108 ///取得用SQLの作成 109 let queryString = "SELECT * FROM TestData" 110 111 var stmt:OpaquePointer? 112 //SQLを実行する 113 if sqlite3_prepare(db, queryString, -1, &stmt, nil) != SQLITE_OK{ 114 let errmsg = String(cString: sqlite3_errmsg(db)!) 115 print("error preparing insert: (errmsg)") 116 return 117 } 118 //実行したSQLから値を取り出す 119 while(sqlite3_step(stmt) == SQLITE_ROW){ 120 let eventText = String(cString: sqlite3_column_text(stmt, 0)) 121 let date = String(cString: sqlite3_column_text(stmt, 1)) 122 123 let event = Event(date: date,eventString: eventText) 124 eventList.append(event) 125 } 126//eventStringが正しく保存されていない 127 for event in eventList { 128 print(event.eventString) 129 print(event.date) 130 } 131 } 132} 133 134 135class Event { 136 137 var date:String = String() 138 var eventString:String = String() 139 140 init(date:String, eventString:String) { 141 self.date = date 142 self.eventString = eventString 143 } 144 145} 146
回答2件
あなたの回答
tips
プレビュー