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

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

解決済

1回答

2830閲覧

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/07 15:09

初心者です。
Xcode内にRealmSwiftを入れました。
あるViewControllerで

swift

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

としてデータをRealmにきちんと入れました。ここまではできています。
ここで、違うViewControllerにおいてLabelを設置し、Label.textにRealmに入れたuserIDを表示させたいです。そこで、このようなコードを書きました。

Swift

1import UIKit 2import RealmSwift 3class InformationViewController: UIViewController { 4 @IBOutlet weak var userID: UILabel! 5   override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 // Realmのインスタンスを取得 9 let realm = try! Realm() 10 // Realmに保存されてるDog型のオブジェクトを全て取得 11 let vals = realm.objects(realmDataSet.self) 12 // ためしに名前を表示 13 for val in vals { 14 print("userID: (val.userID)") 15 if val.userID != nil && val.userID != "" { 16 userID.text = "userID: (val.userID)" 17 } 18 } 19 } 20} 21

コードにエラーはありませんが、Runをさせると AppDelegate で Thread 1: signal SIGABRT というエラーが出て来てしまいました。
これはどういうことなのでしょうか。どこをどう直せば良いのでしょうか。

ちなみにRealmのclassは別のViewControllerに書きました。このようになっています。

Swift

1import Foundation 2import RealmSwift 3 4class realmDataSet: Object { 5 6 @objc dynamic var userID = "" 7 @objc dynamic var coupon = "" 8 @objc dynamic var result = "" 9 @objc dynamic var flag1 = false 10 @objc dynamic var flag2 = false 11 @objc dynamic var flag3 = false 12 @objc dynamic var temp1 = "" 13 @objc dynamic var temp2 = "" 14 @objc dynamic var temp3 = "" 15 16} 17struct RealmModel { 18 19 struct realm{ 20 21 static var realmTry = try!Realm() 22 static var realmsset = realmDataSet() 23 static var usersSet = RealmModel.realm.realmTry.objects(realmDataSet.self) 24 25 } 26} 27

ご教授お願いします。

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

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

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

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

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

fuzzball

2019/01/08 01:56

Consoleに表示されているエラーメッセージを書いて下さい。
xinxin

2019/01/08 04:28

console にエラーはありません。AppDelegate で Thread 1: signal SIGABRT と出ます。
fuzzball

2019/01/08 04:49

エラーが無いことを確認できるスクリーンショットをお願いします。
xinxin

2019/01/08 05:06

コードを書き換えました。新しいエラーが出て来てしまいました。 https://teratail.com/questions/167629 こちらをご覧ください。よろしくお願いします。
fuzzball

2019/01/08 05:10

こちらの質問は解決したということでしょうか?解決したのであればcloseして下さい。
guest

回答1

0

ベストアンサー

難しく考えすぎじゃないですか?下記のコードのみで動きますよ。
struct RealmModelは一緒にしておく必要もなさそうですし、いらないのでは?

Swift

1import Foundation 2import RealmSwift 3 4class RealmData: Object { 5// ↑クラスは大文字の方がわかりやすいのと、 6// 個々のデータなので、名前も勝手に変えさせてもらいました。 7 8 @objc dynamic var userID = "" 9 @objc dynamic var coupon = "" 10 @objc dynamic var result = "" 11 @objc dynamic var flag1 = false 12 @objc dynamic var flag2 = false 13 @objc dynamic var flag3 = false 14 @objc dynamic var temp1 = "" 15 @objc dynamic var temp2 = "" 16 @objc dynamic var temp3 = "" 17 18} 19 20import UIKit 21import RealmSwift 22 23class SampleRealmViewController: UIViewController { 24 25 let realm = try! Realm() 26 let totalData = try! Realm().objects(RealmData.self) 27 28 override func viewDidLoad() { 29 super.viewDidLoad() 30 31 print("データ設定前のtotalData:", totalData) 32 // まずデータを作る 33 if totalData.count == 0 { 34 let array = client.restext // 個数?中身がわからなかったので配列と想定しました。 35 try! realm.write { 36 for n in 0 ... array.count - 1 { 37 let data = RealmData() // まずRealmDataのインスタンスを作る 38 data.userID = array[n] //それぞれの要素に中身を詰める 39 // ~ここで他の要素必要なら登録~ 40 realm.add(data) //そして保存する 41 } 42 } 43 } 44 print("データ設定後のtotalData:", totalData) 45 } 46 47 // 勝手にUIButtonで表示にしました。 48 @IBAction func actionBtnPressed(_ sender: Any) { 49 for n in 0 ... self.totalData.count - 1 { 50 let data = self.totalData[n] // 各データからインスタンス作る 51 print(data.userID) // 必要なものを取り出す。 52 } 53 } 54 55} 56

[追記]
よくありきたりなピットフォールはRealm Objectの構造を途中で変えた場合、
実機orシュミレーターのアプリを一度削除しないとエラーになります。
データ構造が変化してるので、以前のファイルが使えない。

また、コンソールにエラーが出るのでわかると思いますが、
Realm Objectの中身の変更は、realm.write{ }内でしか行えない。

あと、let person = [realmDataSet(value: ["userID": client.restext])]
のようにRealmのObjectを[ ]で囲んでdictionaryやArrayにすることはまずない。
理由はRealm自体でDictionaryやArrayが作れて、ほぼDictionaryやArrayと同じ使い勝手だから
取り出した、StringやInt, Doubleなどはもちろん、DictionaryやArrayにすることはあるけど。

最後にtry「!」と書いたら、エラーは無視するという意味なので、do {} catch {}
を使ってるけど、実際にそこに値が入ることはない。

投稿2019/01/07 15:54

編集2019/01/07 17:05
hameji001

総合スコア639

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

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

xinxin

2019/01/07 23:30

ご教授ありがとうございます。 let array = client.restext // 個数?中身がわからなかったので配列と想定しました。 のところで Use of unresolved identifier 'client'; did you mean 'cgetent'? とエラーが出ました。 client.restextという中身が定義されてないように見えます。
hameji001

2019/01/07 23:37

いやいや、元々のxinxinさんのコードにある 「client. restext」をそのまま使っただけです。 そのコードはどこからかのコピペですか??? こちらではそこがなんなのかは理解しかねますが ご自分でどうにかしてもらわないと
xinxin

2019/01/08 02:10

一番上のコードでRealmに”userID”=client.restextとして文字列のデータを入れました。そのデータを出して再び使いたいです。その場合に使う関数はuserIDの方ですか?
hameji001

2019/01/08 09:03 編集

2つ質問が立ってますが、 解決済みになったので、こちらは不要と理解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問