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

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

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

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

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift

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

Q&A

1回答

2087閲覧

Swift Realm から日付が一致しているものを抽出したい(filterメソッド使用)

vitaminC

総合スコア41

Realm

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

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Swift

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

0グッド

0クリップ

投稿2022/12/23 18:36

編集2022/12/23 18:40

前提

SwiftでRealmから日付が一致したデータを抽出したいです。
値は一致しているように見えるのですが不一致なようでデータが抽出できません。

データの型も一致 Date? しており、日付のフォーマット方法も同じです。

filterを使って抽出しようとしているのですが、他にも方法あれば、ご教授いただきたいです。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • Realmから日付が一致するデータを抽出する

該当のソースコード

Swift

1//モデル 2class Data: Object { 3 @objc dynamic var date: Date? = nil 4 @objc dynamic var a = 0 5 @objc dynamic var b: Double = 0.0 6 @objc dynamic var c: Double = 0.0 7 8 convenience init (date: Date?) { 9 self.init() 10 self.date = date 11 } 12 13 func formattedDate() -> String { 14 guard let date = self.date 15 else {return ""} 16 let dateFormatter = DateFormatter() 17 dateFormatter.dateStyle = .medium 18 dateFormatter.timeStyle = .medium 19 dateFormatter.locale = Locale(identifier: "ja_JP") 20 21 return dateFormatter.string(from: date) 22 } 23} 24 25class Data2: Object { 26 @objc dynamic var date: Date? = nil 27 28 //初期化 29 convenience init (date: Date?) { 30 self.init() 31 self.date = date 32 } 33} 34//date2はData2modelから取り出した値(日付date?) 35 36 37let realmData = try! Realm().objects(Data.self).filter("date == %@", date2) 38//Expression implicitly coerced from 'Date?' to 'Any' 39//黄色の注意なので放置Provide a default value to avoid this warning fix 40//しても結果は変わらず 41 42let count = realmData.count 43print("realmData.count",count). //出力0 44 45let realmDatao2 = try! Realm().objects(Data.self) 46 47let a = realmData[0].date 48 49if date2 == a{ 50 print("一致",date2, a) 51 } else { 52 print("不一致",date2, a) 53} 54 55/* 56出力結果 57 58realmData Results<AData> <0x13c540660> ( 59 60) 61realmData.count 0 62 63 64 65不一致 66Optional(2022-12-23 05:31:23 +0000) 67Optional(2022-12-23 05:31:23 +0000) 68 69 70 71Realm Studio 72 73date date? 742022-12-23T05:31:23.480Z 75 76date date? 772022-12-23T05:31:23.480Z 78 79realm内でも値は一致しています。 80 81 82*/ 83 84 85 86 87

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

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

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

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

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

guest

回答1

0

Date型に入っている値は、日付だけでなく、時刻(マイクロ秒精度)も入っていますので、マイクロ秒まで一致しているデータでないと一致判定されません。(RealmStudioのDate表示はミリ秒までしか表示されませんので、ミリ秒レベルの表示が一致していても実際に格納されているマイクロ秒レベルまで一致していなければ一致判定されません。)

例えば、

swift

1let date2 = Date() 2usleep(10) 3let a = Date() 4print(date2, date2.timeIntervalSinceReferenceDate) 5print(a, a.timeIntervalSinceReferenceDate) 6if date2 == a{ 7 print("一致",date2, a) 8} else { 9 print("不一致",date2, a) 10}

上記のようにdate2を取得して10マイクロ秒後にaを取得した場合

2022-12-24 01:17:34 +0000 693537454.721133 2022-12-24 01:17:34 +0000 693537454.721143 不一致 2022-12-24 01:17:34 +0000 2022-12-24 01:17:34 +0000

date2とaは不一致と判定されます。

マイクロ秒まで厳密に一致しているものを検索したいのではなく、日付が一致しているものを検索したいのであれば、
https://teratail.com/questions/131362
の質問にあるように、当日の午前0時以上、翌日の午前0時未満になっているものを検索する必要があります。

なお、 Expression implicitly coerced from 'Date?' to 'Any' の警告は、 date2 がオプショナル型の変数になっているためだと推測されます。 date2 がnilではない保証がとれているのであれば date2! でアンラップしたものを指定すれば警告は消えると思います。

投稿2022/12/24 01:22

TakeOne

総合スコア6299

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問