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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

2回答

1407閲覧

Realmからデータの取得

xinxin

総合スコア16

Realm

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/01/08 04:43

初心者です。
あるViewControllerにおいてRealmにデータをvalue: ["userID": client.restext]として保存しました。client.restext は文字列です。下のようなコードです。保存はきちんとできています。

Swift

1do { 2 let realm = try Realm() 3 let person = [realmDataSet(value: ["userID": client.restext])] 4 try! realm.write { 5 realm.add(person) 6 print("OK", person) 7 } 8 } catch{ 9 print("error") 10 } 11 }

この保存したデータを別のViewControllerでボタンを押したらLabelが出て来て、Label.textにその文字を出したいです。下のようなコードを書きました。

Swift

1import Foundation 2import RealmSwift 3class realmDataSet: Object { 4 5 @objc dynamic var userID = "" 6 @objc dynamic var coupon = "" 7 @objc dynamic var result = "" 8} 9import UIKit 10import RealmSwift 11class InformationViewController: UIViewController { 12 13 @IBOutlet weak var seeUserID: UIButton! 14 @IBOutlet weak var myUserID: UILabel! 15 let realm = try! Realm() 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 } 20 21 @IBAction func seeUserID(_ sender: Any) { 22 let person = try! realm.objects(realmDataSet.self) 23 self.myUserID.text = person.userID 24 } 25}

ただ、self.myUserID.text = person.userID にところでValue of type 'Results<realmDataSet>' has no member 'userID'とエラーが出て来ました。
これはどういうことなのでしょうか。Classの方で @objc dynamic var userID = "" とは言っているのになぜ存在しないのでしょうか。
ご教授願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

気に入る答えが得られないので、
別に質問を立てるのは、感心しませんが、、、

realmの使い方をもう少し勉強する必要があると思います。
前回の回答でも取り出し方を書きましたが、、、見ましたでしょうか?
try! realm.objects(realmDataSet.self)が取得するものは、
realmDataSetがたくさん集まった、集合体です。

変な説明かもしれませんが、例えば、
学校にはたくさんのクラスがあります。
ひとクラスは決まった人数の生徒がいます。
生徒の名前を取得したい時、
A組.名前では取得できず。
A組[出席番号2].名前とすれば特定の人をさし、
名前を取得できます。

今回の場合に当てはめると、
realm.objects(realmDataSet.self)はここでいうクラス(組)をさします。
realmDataSetが人をさしています。
realm.objects(realmDataSet.self)から特定のデータを取得するためには、
ほぼ配列になっているので、
[1], [3]のように何番目のデータかを指定することで、
やっとその要素のuserIDを取得できます。

なので、person[0].userIDとすることで、
0番目の要素を取り出せます。

ちなみに、前回も言いましたが、登録の仕方の「client.restext」ですが、
きっと、文字列を代入した定数or変数ということですよね。
それならば納得です。

そして、登録がきちんとできているというのはprint("OK", person)で
確認しているつもりかもしれませんが、
personは登録する中身自体であり、
それをprintしても登録する前のデータを表示しているだけです。
登録後のデータを確認したいのならば、
let person = try! realm.objects(realmDataSet.self)
print("person:", person.description)で出力しないといけないですよ。

参考になれば、、、まぁ、聞くか聞かないかは、それぞれの自由ですね。

投稿2019/01/08 05:09

編集2019/01/08 05:29
hameji001

総合スコア639

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

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

xinxin

2019/01/08 05:43 編集

わかりやすい説明ありがとうございます!今回Realmに触れるのが初めてで使い方など全くわかりませんでした。 実行したところ、AppdelegateのところでThread 1: signal SIGABRTが出ました。これがどういうことかわかりますか? コンソールでは Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x10e012180> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key myUserID.' とでて来ました。
hameji001

2019/01/08 05:33 編集

どこで、エラーになっているかよくわかりません。 一度、アプリを削除して、再度Buildしてみてください。 もしそれでもダメなら、おそらくですが、 データの登録がうまくいってないと予想してます。 データ登録の後で、 let person = try! realm.objects(realmDataSet.self) print("person:", person.description) を書いてみてください。 ちゃんと、データが出力されればいいですが、 きっと出力されないのではと思います。 出力されたものを再びあげていただければ、 またアドバイスできると思います。
xinxin

2019/01/08 06:35

このrealmDataSetを他のViewcontrollerでも使いたいです。 import RealmSwift class realmDataSet: Object { @objc dynamic var userID = "" @objc dynamic var coupon = "" @objc dynamic var result = "" @objc dynamic var flag1 = false @objc dynamic var flag2 = false @objc dynamic var flag3 = false @objc dynamic var temp1 = "" @objc dynamic var temp2 = "" @objc dynamic var temp3 = "" } の部分をあるViewControllerに書いて他の全てのViewControllerで共有する場合、このuserIDのデータを使う前に何を書きますか? コード部分に Use of unresolved identifier 'realmDataSet' と出て来てしまいました。
hameji001

2019/01/08 08:55

前のは解決したのでしょうか? 他のViewで用いる場合は、 ただ、上記の内容を別swiftファイル(realmDataSet.swfitなど)にして、 使うviewの先頭にimport RealmSwiftを追加するだけで、 あとは使いたいものを呼び出せばいいだけです。
xinxin

2019/01/08 09:01

できました!本当にありがとうございます。ものすごく助かりました!
guest

0

Resultsには一つのデータが入っているのではなく複数のデータが入っています。
メンバには、一つのデータを取り出してからアクセスして下さい。

例えば、

swift

1person.first?.userID

これで、先頭データのuserIDにアクセスできます。

投稿2019/01/08 05:52

fuzzball

総合スコア16731

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

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

xinxin

2019/01/08 06:41

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問