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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

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

Swift

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

解決済

RealmSwiftを介した、Boolの値の更新ができない

tyki
tyki

総合スコア1

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

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

Swift

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

1回答

0グッド

0クリップ

286閲覧

投稿2022/11/29 17:46

編集2022/11/29 17:48

前提・実現したいこと

  • クイズアプリを iOS で作成しております。
  • RealmSwift を利用した、DB操作を行うことで、正解、不正解した問題を記録しようとしております。
  • 問題は、CSVからQuestionとして保存して、QuizViewControllerで読み書きしようと考えております。
  • 正解・不正解は、Bool型にしているのですが、RealmSwiftを利用して、Boolを更新ができずにこまっております。
  • RealmSwiftを介した、Boolの値の更新ができるようにしたいです。

発生している問題・エラーメッセージ

  • RealmSwiftを介した、Boolの値の更新ができない。
  • updateCorrectQuestion(), updateIncorrectQuestion() の realm.write() 前後に Print を仕込んでみたのですが、正解しても、nil になっていたり、Optional(false)になってしまいます。

該当のソースコード

swift

1import UIKit 2import GoogleMobileAds 3import RealmSwift 4 5class QuizViewController: UIViewController { 6 7 var bannerView: GADBannerView! 8 var quizArray: [String] = [] 9 var answeredQuestionCount = 0 10 var correctCount = 0 11 var selectedGenre = 0 12 13 let csvArray = loadCsv(fileName: "question") 14 15 let realm = try! Realm() 16 lazy var targetQuestions = realm.objects(Question.self) 17 .filter("genreNumber = \(selectedGenre)") 18 .filter("wasCorrect != true") 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 for csvStr in csvArray { 24 if (csvStr == "") { 25 break 26 } 27 Question().saveCsvValue(csvStr: csvStr) 28 } 29 setQuestion() 30 } 31 32 // ボタンを押したときに呼ばれる 33 @IBAction func btnAction(sender: UIButton){ 34 if sender.tag == targetQuestions[answeredQuestionCount].answer { 35 correctCount += 1 36 judgeImageView.image = UIImage(named: "correct") 37 updateCorrectQuestion() 38 }else{ 39 judgeImageView.image = UIImage(named: "incorrect") 40 updateIncorrectQuestion() 41 } 42 judgeImageView.isHidden = false 43 answerButton1.isEnabled = false 44 answerButton2.isEnabled = false 45 answerButton3.isEnabled = false 46 answerButton4.isEnabled = false 47 48 DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){ 49 self.judgeImageView.isHidden = true 50 self.answerButton1.isEnabled = true 51 self.answerButton2.isEnabled = true 52 self.answerButton3.isEnabled = true 53 self.answerButton4.isEnabled = true 54 55 self.setNextQuestion() 56 } 57 } 58 59 /** 60 正解した問題を正解した問題として記録する 61 */ 62 private func updateCorrectQuestion(){ 63 print("XXXXX - Correct : \(targetQuestions[answeredQuestionCount].wasCorrect)") 64 // todo - Boolを保存できるように修正 65 try! realm.write{ 66 targetQuestions[answeredQuestionCount].wasCorrect = true 67 } 68 print("XXXXX - Correct : \(targetQuestions[answeredQuestionCount].wasCorrect)") 69 } 70 71 /** 72 不正解だった問題を不正解の問題として記録する 73 */ 74 private func updateIncorrectQuestion(){ 75 print("XXXXX - InCorrect : \(targetQuestions[answeredQuestionCount].wasCorrect)") 76 // todo - Boolを保存できるように修正 77 try! realm.write{ 78 targetQuestions[answeredQuestionCount].wasCorrect = false 79 } 80 print("XXXXX - InCorrect : \(targetQuestions[answeredQuestionCount].wasCorrect)") 81 } 82 83 private func setQuestion(){ 84 quizNumberLabel.text = "第\(answeredQuestionCount + 1)問" 85 quizTextView.text = targetQuestions[answeredQuestionCount].statement 86 answerButton1.setTitle(targetQuestions[answeredQuestionCount].choise1, for: .normal) 87 answerButton2.setTitle(targetQuestions[answeredQuestionCount].choise2, for: .normal) 88 answerButton3.setTitle(targetQuestions[answeredQuestionCount].choise3, for: .normal) 89 answerButton4.setTitle(targetQuestions[answeredQuestionCount].choise4, for: .normal) 90 } 91 92 private func setNextQuestion(){ 93 answeredQuestionCount += 1 94 if answeredQuestionCount < 10 { 95 setQuestion() 96 } else { 97 performSegue(withIdentifier: "toScoreVC", sender: nil) 98 } 99 } 100}

swift

1import RealmSwift 2 3class Question: Object { 4 @Persisted var questionId: String = "" 5 @Persisted var genreNumber: Int 6 @Persisted var statement: String = "" 7 @Persisted var answer: Int 8 @Persisted var choise1: String 9 @Persisted var choise2: String 10 @Persisted var choise3: String 11 @Persisted var choise4: String 12 @Persisted var wasCorrect: Bool? 13 14 func saveCsvValue(csvStr:String) { 15 // CSVなのでカンマでセパレート 16 let splitStr = csvStr.components(separatedBy: ",") 17 self.questionId = splitStr[0] 18 self.genreNumber = Int(splitStr[1]) ?? 0 19 self.statement = splitStr[2] 20 self.answer = Int(splitStr[3]) ?? 0 21 self.choise1 = splitStr[4] 22 self.choise2 = splitStr[5] 23 self.choise3 = splitStr[6] 24 self.choise4 = splitStr[7] 25 self.wasCorrect = Bool(splitStr[8]) 26 // 保存 27 let realm = try! Realm() 28 do { 29 try realm.write { 30 realm.add(self) 31 } 32 } catch { 33 } 34 } 35} 36

自分で調べたことや試したこと

  • Printによる、デバッグ

使っているツールのバージョンなど補足情報

  • OS : macOS Monterey
  • version : 12.3
  • XCode : 13.4.1
  • Realm :

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

自信はないですが、
.filter() が悪さをしている気がします。

filter("genreNumber = (selectedGenre)")
のイコールをイコールイコールにするか

filter をどちらも取り除いて試すことで
うまくいかないでしょうか?

swift

1lazy var targetQuestions = realm.objects(Question.self) 2 .filter("genreNumber == \(selectedGenre)") 3 .filter("wasCorrect != true")

swift

1lazy var targetQuestions = realm.objects(Question.self) 2 //.filter("genreNumber = \(selectedGenre)") 3 //.filter("wasCorrect != true")

投稿2022/11/30 04:02

uni2

総合スコア177

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

tyki

2022/11/30 16:39

uni2 さん、ご解答ありがとうございます!! ご提案の2つ目の方法で解決いたしました!filter が悪さをしていたようです。 fileter はうまくいっているだろうとたかを括っており、デバックしておりませんでした、申し訳ございません。 ありがとうございました。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

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

Swift

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