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

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

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

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

iOS

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

Xcode

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

Swift

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

Q&A

解決済

1回答

353閲覧

Realmのfilterが上手くいかない

dreamland

総合スコア43

Realm

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

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/04/16 08:31

前提・実現したいこと

FScalendarを使って、カレンダーアプリを作っています。Realmに保存したイベントと日付をその日付がタップされたらセルにイベントが表示されるようにしたいです。

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

filterを使わずに、var result = realm.objects(Schedule.self)と書くと全て保存されたデータが(違う日付に保存されたデータも)表示されてしまいます。なので、filterを用いてvar result = realm.objects(Schedule.self).filter("duedate == '(da)'")と書いてみたのですが、何も表示されません。

filter部分が上手くいっていないと思うのですが、どう書いたらいいのかよく分かりません。もし、教えていただけたらありがたいです。ちなみに、Realmの方にはちゃんと保存されています。

該当のソースコード

import UIKit import RealmSwift class ViewController: UIViewController, UITextFieldDelegate { @IBOutlet weak var task: UITextField! @IBOutlet weak var goal: UITextField! @IBOutlet weak var duedate: UITextField! var datePicker: UIDatePicker = UIDatePicker() override func viewDidLoad() { super.viewDidLoad() dateselector() task.delegate = self goal.delegate = self duedate.delegate = self let realm = try! Realm() print(Realm.Configuration.defaultConfiguration.fileURL!) } func dateselector () { //ピッカー設定 datePicker.datePickerMode = UIDatePicker.Mode.date datePicker.timeZone = NSTimeZone.local datePicker.locale = Locale(identifier: "ja-JP") //バーの設定 let toolbar = UIToolbar() toolbar.sizeToFit() let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let todaybtn = UIBarButtonItem(title: "今日", style: .plain, target: nil, action: #selector(today)) let donebtn = UIBarButtonItem(title: "完了", style: .done, target: nil, action: #selector(done)) toolbar.setItems([flexibleSpace,todaybtn,donebtn], animated: true) duedate.inputView = datePicker duedate.inputAccessoryView = toolbar } @objc func today() { datePicker.date = Date() let formatter = DateFormatter() formatter.dateFormat = "yyyy年M月dd日" duedate.text = "(formatter.string(from:Date()))" } @objc func done() { duedate.endEditing(true) //日付のフォーマット let formatter = DateFormatter() formatter.dateFormat = "yyyy年M月dd日" duedate.text = "(formatter.string(from: datePicker.date))" } @IBAction func save (_sender:Any){ if task.text!.count > 0 && (goal.text?.count)! > 0 && (duedate.text?.count)! > 0 { let realm = try! Realm() try! realm.write { let rel = [Schedule(value:["task":task.text!,"goal":goal.text!,"duedate":duedate.text!])] realm.add(rel) self.performSegue(withIdentifier: "toCalendar", sender: nil) } } } }
import UIKit import FSCalendar import CalculateCalendarLogic import RealmSwift class CalenderViewController: UIViewController, FSCalendarDelegate, FSCalendarDataSource, UITableViewDelegate, UITableViewDataSource, FSCalendarDelegateAppearance, UIGestureRecognizerDelegate { var CalendarArray = [Schedule]() var selectedText: String? @IBOutlet weak var tableView : UITableView! @IBOutlet weak var calendar : FSCalendar! override func viewDidLoad() { super.viewDidLoad() //tableView.tableFooterView = UIView() calendar.delegate = self calendar.dataSource = self tableView.delegate = self tableView.dataSource = self } override func viewWillAppear(_ animated: Bool) { tableView.reloadData() } //表示する個数 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return CalendarArray.count } //セルがタップされた場合 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("(indexPath.row)番目の行が選択されました.") } //表示する内容 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { print(13) //dequeueReusableCellとは、使い回し let cell = tableView.dequeueReusableCell(withIdentifier: "goalCell", for: indexPath) cell.textLabel?.text = CalendarArray[indexPath.row].task return cell } //データ取得 func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) { print("hey there!") let tmpDate = Calendar(identifier: .gregorian) let year = tmpDate.component(.year, from: date) let month = tmpDate.component(.month, from: date) let day = tmpDate.component(.day, from: date) print("(year)/(month)/(day)") let da = "(year)/(month)/(day)" let realm = try! Realm() var result = realm.objects(Schedule.self) //var result = realm.objects(Schedule.self).filter("duedate == '(da)'") CalendarArray.removeAll() for a in result { CalendarArray.append(a) } tableView.reloadData() }
import Foundation import RealmSwift class Schedule: Object { @objc dynamic var task = "" @objc dynamic var goal = "" @objc dynamic var duedate = "" }

補足情報(FW/ツールのバージョンなど)

Xcode version 10.1
Swift version 4.2.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

#1 filterの書式

「realm filter」でググりました。

swift

1filter("duedate == %@", da)

ref.
Realmでfilterの検索条件に変数を利用するには

#2 日付の形式

保存時の形式yyyy年M月dd日と、filter時の形式(year)/(month)/(day)が違うので、同じ日付であってもfilterの条件に引っ掛かりません。同じ形式に統一して下さい。

例えば今日の場合だと、2019年4月18日2019/4/18という二つの文字列を比較することになります。

投稿2019/04/16 08:49

編集2019/04/18 02:59
fuzzball

総合スコア16731

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

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

dreamland

2019/04/17 03:33

filter("duedate == %@", da)に変更して実行してみたんですが、上手くいきませんでした。他の原因として、何が考えられるでしょうか?
fuzzball

2019/04/17 03:54

duedata == da に一致するものが無いのでは?
dsuzuki

2019/04/17 05:01

保存するときの日付フォーマットは "yyyy年M月dd日" filterで指定する日付フォーマットは "(year)/(month)/(day)" フォーマットが違うのでfilterに引っかかりません。
dreamland

2019/04/18 00:35

フォーマットが違うのですね。同じフォーマットにしないと、表示されないということですね。では、なんのフォーマットに変えてあげたらいいのでしょうか?
fuzzball

2019/04/18 00:47

何が問題になっているのか理解できていませんか?
dsuzuki

2019/04/18 01:04

filter("duedate == %@", da)は da で指定した値が Schedule.duedata に設定されているレコードを抽出する処理です。 Stringの"2019年1月1日"と"2019/1/1"は同じですか? filterで指定する日付フォーマットを、保存するときの日付フォーマットと同じにすれはいいと思いますが。
dreamland

2019/04/18 01:10

フォーマットを変更したらできました!ありがとうございます!
dsuzuki

2019/04/18 02:38

解決したのなら、「受付中」のまま放置せずに、「解決済」「ベストアンサー」を設定してください。
fuzzball

2019/04/18 02:59

選ばれてしまったので吸収しておきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問