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

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

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

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

Swift

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

Q&A

解決済

1回答

3010閲覧

Realmデータをidで検索したい

tatsuya_335

総合スコア7

Realm

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

Swift

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

0グッド

0クリップ

投稿2018/09/30 08:17

前提

現在Realmを使用し、1対多のモデル定義を行い、アプリを作成しております。
旅行の計画を立てるようなアプリです。

下記が1対多のモデル定義になります。

swift

1import RealmSwift 2 3class TravelData: Object { 4 @objc dynamic var id = 0 5 6 @objc dynamic var date = Date() 7 8 @objc dynamic var travelTitle = "" 9 10 @objc dynamic var departureData = "" 11 12 @objc dynamic var returnData = "" 13 14 @objc dynamic var travelImage = NSData() 15 16 let plansDatas = List<PlanData>() 17 18 let PackingDatas = List<PackingData>() 19 20 let GiftDatas = List<GiftData>() 21 22 let MemoDatas = List<MemoData>() 23 24 override static func primaryKey() -> String? { 25 return "id" 26 } 27} 28 29class PlanData: Object { 30 @objc dynamic var scheduleTitle = "" 31 32 @objc dynamic var startTime = "" 33 34 @objc dynamic var endTime = "" 35 36 @objc dynamic var scheduleDate = "" 37 38 @objc dynamic var scheduleImage = NSData() 39}

PlanData以外のPackingDataクラスなどは、PlanDataと同じ構成になるので省略しています。

初めに表示されるCollectionViewで計画の一覧を表示しています。
各セルをタップすると画面遷移し、タップした計画のデータ(持ち物リストやスケジュール)が表示される仕組みになります。

やりたいこと

初めに表示されるCollectionViewでタップした計画(TravelData)に保存されているPlanDataやPackingDataを表示したい。

発生している問題

実際にタップした対象のTravelDataにPlanData等保存することができたが、データを取得してTableViewに表示させることができない。

該当のソースコード

初めに表示される計画一覧画面

swift

1import UIKit 2import RealmSwift 3 4class ViewController: UIViewController,UICollectionViewDataSource,UICollectionViewDelegate { 5 6 @IBOutlet var collectionView: UICollectionView! 7 8 let realm = try! Realm() 9 var travelDataArray = try! Realm().objects(TravelData.self).sorted(byKeyPath: "date", ascending: false) 10 11 var planDatas = List<PlanData>() 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 collectionView.delegate = self 17 collectionView.dataSource = self 18 19 collectionView.register(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCell") 20 21 let layout = UICollectionViewFlowLayout() 22 layout.itemSize = CGSize(width: 157, height: 157) 23 collectionView.collectionViewLayout = layout 24 25 layout.sectionInset = UIEdgeInsetsMake(30, 15, 15, 15) 26 27 28 } 29 30 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 31 return travelDataArray.count 32 } 33 34 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 35 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CustomCell", for: indexPath) as! CustomCell 36 37 cell.imageView.layer.cornerRadius = 75 38 cell.imageView.layer.masksToBounds = true 39 40 let travelData = travelDataArray[indexPath.row] 41 42 cell.titleLabel.text = travelData.travelTitle 43 cell.departureDateLabel.text = travelData.departureData 44 cell.returnDateLabel.text = travelData.returnData 45 cell.imageView.image = UIImage(data: travelData.travelImage as Data) 46 47 return cell 48 } 49 50 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 51 self.planDatas = self.travelDataArray[indexPath.row].plansDatas 52 self.performSegue(withIdentifier: "next", sender: nil) 53 } 54 55 56 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 57 if segue.identifier != "next" { 58 let createViewController: CreateViewController = segue.destination as! CreateViewController 59 let travelData = TravelData() 60 61 let allTravelDatas = realm.objects(TravelData.self) 62 if allTravelDatas.count != 0 { 63 travelData.id = allTravelDatas.max(ofProperty: "id")! + 1 64 } 65 createViewController.travelData = travelData 66 } else if segue.identifier == "next" { 67 let scheduleViewController: ScheduleViewController = segue.destination as! ScheduleViewController 68 scheduleViewController.planDatas = self.planDatas 69 } 70 } 71 72 override func viewWillAppear(_ animated: Bool) { 73 super.viewWillAppear(animated) 74 collectionView.reloadData() 75 } 76 77 override func didReceiveMemoryWarning() { 78 super.didReceiveMemoryWarning() 79 } 80}

上記のCollectionViewセルをタップ後、スケジュール画面に遷移

swift

1 2import UIKit 3import RealmSwift 4 5class ScheduleViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 6 7 @IBOutlet var tableView: UITableView! 8 9 let realm = try! Realm() 10 11 var planDatas = List<PlanData>() 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 16 tableView.delegate = self 17 tableView.dataSource = self 18 19 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 20 return self.planDatas.count 21 } 22 23 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 24 let cell = tableView.dequeueReusableCell(withIdentifier: "ScheduleCell", for: indexPath) as! ScheduleCell 25 26 let planData = planDatas[indexPath.row] 27 cell.scheduleTitle.text = planData.scheduleTitle 28 cell.startTime.text = planData.startTime 29 cell.endTime.text = planData.endTime 30 cell.scheduleImage.image = UIImage(data: planData.scheduleImage as Data) 31 32 return cell 33 } 34 35 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 36 37 38 } 39 40 override func viewWillAppear(_ animated: Bool) { 41 super.viewWillAppear(animated) 42 tableView.reloadData() 43 } 44 45 46 override func didReceiveMemoryWarning() { 47 super.didReceiveMemoryWarning() 48 49 50 } 51 52} 53

試したこと

コードはあげていませんが、スケジュール追加画面でスケジュールを追加すると、問題なくタップした対象の計画にのみスケジュールを追加することはできています。(Realm studioで確認済)

困っていること

最初の画面の、
var travelDataArray = try! Realm().objects(TravelData.self).sorted(byKeyPath: "date", ascending: false)
var planDatas = List<PlanData>()
self.planDatas = self.travelDataArray[indexPath.row].plansDatas
上記で、タップした計画のPlanDataクラスを取得できると思っていたんですが、
ScheduleViewにprepareで値を渡しても表示されませんでした。

idで対象のTravelDataを取得してそこに保存されているPlanDataをTableViweに表示できればいいのですが、うまくできませんでした。

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

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

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

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

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

guest

回答1

0

自己解決

最初のViewでタップしたidを取得して、値を画面遷移時に渡して次のコードでできるようになりました。

let travelData = try! Realm().objects(TravelData.self).filter("id == %@", self.id).last

swift

1let travelData = try! Realm().objects(TravelData.self).filter("id == %@", self.id).last 2let planDatas = travelData?.plansDatas

投稿2018/10/03 11:51

tatsuya_335

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問