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

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

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

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

497閲覧

realmに保存したデータを選んで表示させる

TakenobuShimura

総合スコア4

Realm

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

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/07/03 13:54

以下の「問題」画面で保存してあるrealmのデータをランダムに表示させているのですが、「解答」画面には「問題」画面で表示されたものの答えを表示させたいです。realmには以下のように(ex. Appleの意味は?、りんごのような感じ)保存されています。初心者なのでわからないことも多いですが、よろしくお願い致します。
イメージ説明
イメージ説明

「問題」を表示させるコード

override func viewDidLoad() {
super.viewDidLoad()
let applicationSupportDir = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let path = applicationSupportDir.appendingPathComponent("question.realm")
// Realmのデフォルト設定
var config = Realm.Configuration.defaultConfiguration
// Application Supportに変更する
config.fileURL = path
Realm.Configuration.defaultConfiguration = config

let realm = try! Realm() let question = realm.objects(Question.self) for Data in question { ShowTextView.text = Data.Create //ランダムにrealmに保存したデータを表示させる ShowTextView.text = question.randomElement()?.Create }

「解答」を表示させるコード

override func viewDidLoad() {
super.viewDidLoad()

let applicationSupportDir = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let path = applicationSupportDir.appendingPathComponent("question.realm") // Realmのデフォルト設定 var config = Realm.Configuration.defaultConfiguration // Application Supportに変更する config.fileURL = path Realm.Configuration.defaultConfiguration = config let realm = try! Realm() let question = realm.objects(Question.self) for Data in question { AnswerTextView.text = Data.Answer }

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

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

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

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

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

TsukubaDepot

2020/07/03 21:54

コードは```で囲っていただくか、質問画面の<CODE>機能を使って整形していただけますでしょうか。 コード部分が見やすくなるだけではなく、コピーして検証する際にも楽になります。 ご協力よろしくお願いいたします。
guest

回答1

0

ベストアンサー

遷移先の画面で Realm からデータを取ってきたとしても、現在のコードだとそのデータが出題と同一になるとは限りませんから、別の方法を考える必要がありそうです。

データ構造がわからないので、アイデアだけ回答します。

基本的には「値渡し」するのが一番簡単かと思います。

この方法で、解答や問題文に関するデータを次の画面に渡してあげる方法が一つです。つまり、問題出題画面であらかじめ回答も取得しておき、解答を次の画面に渡してあげるという方法です。

もう一つは、Realm で保存する問題に固有の ID を付与し、その情報を値渡しで次の画面に渡し、次の画面では ID を使って再度 Realm から情報を取ってくるという方法です。

ただし、後者の方法だと新しいフィールドが追加されるため、オブジェクトのマイグレーションが必要かと思いますが、ID を付与することでデータが一意になるので検索という観点から考えると便利になります。

ただ、いずれの方法でも値渡しが必要なので、それについては理解を深める必要があるかと思います。


問題、解答を一つのセットとして遷移先に渡すサンプルです。NavigationController を使って遷移しているようなので、元の画面に戻ってきたら別の問題が出るように修正してあります(詳しくはコメントを参照していただけますでしょうか)。

簡単に確認するためRealmデータベースではなくクラスの配列にしていますが、基本的な考え方は同じですので、適宜読み替えてみてくださいますでしょうか。

あと、過去の質問で tyobigorou さんも指摘されていますが、変数名は小文字で始めるなど、Swiftの命名規則に従った方が可読性があがりますので、少しづつ修正されると良いかと思います。

Swift

1import UIKit 2 3// MARK: この程度であれば構造体の方が初期化も楽だが、Realm で使うことを考えて class で宣言 4class Question { 5 var problem: String! 6 var answer: String! 7 8 init(problem: String, answer: String) { 9 self.problem = problem 10 self.answer = answer 11 } 12} 13 14class ViewController: UIViewController { 15 // MARK: 変数(プロパティ)名は小文字で始める 16 @IBOutlet weak var showTextView: UITextView! 17 18 // MARK: Realm データベースの代わり 19 var questions = [ 20 Question(problem: "Appleの意味は?", answer: "りんご!"), 21 Question(problem: "Busの意味は?", answer: "バス!"), 22 Question(problem: "Carの意味は?", answer: "車!"), 23 Question(problem: "Doctorの意味は?", answer: "お医者さん!"), 24 Question(problem: "Emacsの意味は?", answer: "Editing MACroS とか E with MACroS") 25 ] 26 27 // MARK: randomElement() で選択した問題を入れる変数。 28 // クラス内で参照できるようにトップレベルで宣言する。 29 var selectedQuestion: Question! 30 31 // MARK: viewDidLoad() はビュー読み込み時しか実行されない 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 } 35 36 // MARK: 出題する問題は viewWillAppear() で選択し、showTextView に表示させる 37 // ここで表示させれば Navigation Controller で戻ってきた際に別の問題を表示させることができる 38 override func viewWillAppear(_ animated: Bool) { 39 super.viewWillAppear(animated) 40 41 // selectedQuestion() にランダムに選んだ問題の最初の要素を入れる 42 // Realm でアクセスする際もここで問題を取り出す 43 selectedQuestion = questions.randomElement()! 44 45 // 問題だけを表示 46 showTextView.text = selectedQuestion.problem 47 } 48 49 // MARK: ボタンを押したら Segue を実行 50 @IBAction func answerButton(_ sender: Any) { 51 performSegue(withIdentifier: "toAnswer", sender: nil) 52 } 53 54 // MARK: 遷移先にある question という変数に選択した問題を入れる 55 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 56 if let answerVC = segue.destination as? AnswerViewController { 57 // 設問、解答両方を渡しているが、答えだけでもいい 58 answerVC.question = selectedQuestion 59 } 60 } 61}

遷移先

Swift

1import UIKit 2 3class AnswerViewController: UIViewController { 4 @IBOutlet weak var answerTextView: UITextView! 5 6 // MARK: 前の画面から受け取ったデータ 7 var question: Question! 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 // MARK: 解答を表示する 13 answerTextView.text = question.answer 14 } 15}

投稿2020/07/03 21:53

編集2020/07/05 23:53
TsukubaDepot

総合スコア5086

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

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

TakenobuShimura

2020/07/05 23:49

TsukubaDepot様 ご丁寧にコメントをいただき、本当にありがとうございます。 TsukubaDepot様のアドバイスを参考に自分で試行錯誤したところ、最初の「問題」画面でrealmのデータを取り、「解答」画面に値渡しをすることで無事に表示させることができました。 土日に行っていたため、コメントの返答が遅くなり、申し訳ございません。 ご丁寧にアドバイスをいただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問