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

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

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

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

Swift

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

Q&A

解決済

3回答

11930閲覧

RealmSwiftで特定日付のデータを抽出する方法を知りたい

rocav

総合スコア9

Realm

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

Swift

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

0グッド

0クリップ

投稿2017/03/08 06:37

編集2017/03/08 08:06

###前提・実現したいこと
初心者です。
Realmに登録したDate()のデータから日付を指定して抽出・表示したいのですが、よくわからず立ち止まっています。
よろしくお願いします。

###該当のソースコード

###試したこと
NSPredicateを使って前方一致?BEGINSWITH?を使い抽出しようと…
→ どの様に書けばいいのか解らず。検索するも方法が間違っているのか、色々書いてみた考え方が間違っているのかすら理解できていません。
→ 散々考えた数時間の結果、BEGINSWITHはDate()型には使えない…Data()型と読み違えていたことに気がつきました…
→ Stringで登録・BEGINSWITHでソートするか、Date()型のままBETWEENで抽出するか調べています。
→ TimeInterval型を調べています。

###補足情報(言語/FW/ツール等のバージョンなど)
Swift3.0 Xcode8.2.1 RealmSwift2.4.3

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

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

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

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

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

fuzzball

2017/03/08 06:45

日付の型はなんでしょうか?
rocav

2017/03/08 06:50

ご返答ありがとうございます。Date()です。
guest

回答3

0

ベストアンサー

僕はfilterを使ってます。以下一例

swift

1class Daily: Object { 2 dynamic var date = Date() 3} 4 5struct Implementor { 6 let realm = try! Realm() 7 let dailyObject: Results<Daily> 8 9 init() { 10 dailyObject = realm.objects(Object.self) 11 } 12 13 func select(from day: Date) -> Results<Daily> { 14 let result = dailyObject.filter("date == %@", day) 15 return result 16 } 17}

こんな感じでfilterを使うとResults<Daily>が取れるのでそこから.firstで引っ張ってくるなりする事ができます。%@とdayが対応しています。ちなみに複数の条件だと

swift

1let date = dailyObject.filter("date >= %@ AND date <= %@" firstIndex, secondIndex) 2```のように続けて書いていきます。

投稿2017/03/08 08:22

編集2017/03/08 08:24
xAxis

総合スコア1349

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

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

rocav

2017/03/08 11:23

ご回答ありがとうございます。 この書き方は気がつきませんでした。調べている間に一度は見ているはずですよね… 集合を使ったfilterの方が私には解りやすいです。ありがとうございます
guest

0

質問内容が少し変わりましたので回答します。

日付/時間をUNIX時間で扱ってはどうでしょうか?
Date型から.timeIntervalSince1970で簡単に取り出せます。

これはTimeInterval型(実体はDouble型)なので、数値として扱えます。

swift

1let date = Date() 2print(date) 3//=> 2017-03-08 07:35:55 +0000 4 5//Date to UNIX time 6let t = date.timeIntervalSince1970 7print(t) 8//=> 1488958555.64182 9 10//UNIX time to Date 11let date2 = Date(timeIntervalSince1970: t) 12print(date2) 13//=> 2017-03-08 07:35:55 +0000

投稿2017/03/08 07:37

fuzzball

総合スコア16731

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

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

rocav

2017/03/08 08:03

ご回答ありがとうございます。 timeInterval型という存在を初めて知りました。学習期間だけは長いのにお恥ずかしい限りです。 数値として扱えるのですね、timeInterval型を用いて試行錯誤してみます。
guest

0

Swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 2 let cell = table.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 3 4 let dateFormatter = DateFormatter() 5 dateFormatter.dateFormat = "yyyy-MM-dd hh:mm:ss" 6 let oneDay = dateFormatter.date(from: "2017-03-05 00:00:00")! 7 let nextDay = Date(timeInterval: 60*60*24, since: oneDay) 8 9 let realm = try! Realm() 10 let realmData = realm.objects(Object.self).filter("date >= %@ AND date < %@", oneDay, nextDay) 11 12 let label = table.viewWithTag(1) as! UILabel 13 label.text = dateFormatter.string(from: RealmData[indexPath.row].date) 14 15 return cell 16 } 17

ありがとうございました、ひとまず動きました。
関係のありそうなところだけ改変して貼り付けます。

BestAnsにするには自信がありません。どなたかもっとスマートなcodeをいただければ幸いです。

投稿2017/03/08 13:40

編集2017/03/08 13:51
rocav

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問