質問するログイン新規登録

質問編集履歴

2

誤字脱字が反映されていなかったため再度修正

2021/05/20 06:46

投稿

massanmesu
massanmesu

スコア36

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,5 @@
1
1
  ItemというモデルクラスがRealmに格納されています。
2
- 今日の日付を文字列に変換したプロパティ`date`があるのですが、アプリ起動時にこの値が起動した日から一年前以上であるデータを取得するという関数を作りたいです。
2
+ 今日の日付を文字列に変換したプロパティ`date`があるのですが、アプリ起動時に一年前に保存したデータを取得するという関数を作りたいです。
3
3
  ```swift
4
4
  import UIKit
5
5
  import RealmSwift
@@ -37,7 +37,7 @@
37
37
 
38
38
  class ItemTableViewController: UIViewController {
39
39
 
40
- var itemList: Results<Item>!
40
+ var itemList: Results<Item>!
41
41
  var realm = try! Realm()
42
42
 
43
43
 
@@ -46,10 +46,9 @@
46
46
 
47
47
  // 評価対象商品があるか確認
48
48
  confirmEvaluationTargetProduct()
49
-
50
49
  }
51
50
 
52
- private func confirmEvaluationTargetProduct() {
51
+ private func confirmEvaluationTargetProduct() {
53
52
  let items = realm.objects(Item.self)
54
53
  let results = select(items: items)
55
54
 

1

誤字脱字の修正

2021/05/20 06:46

投稿

massanmesu
massanmesu

スコア36

title CHANGED
@@ -1,1 +1,1 @@
1
- Realmで保存したデータを検索する関数filter()について
1
+ Realmで保存したデータを検索する関数filter()に渡す式に使う比較演算子
body CHANGED
@@ -29,4 +29,83 @@
29
29
  }
30
30
  }
31
31
  ```
32
+
33
+ **一年以上前のデータを取得する関数**(質問に関連しないコードは割愛)
34
+ ```
35
+ import UIKit
36
+ import RealmSwift
37
+
38
+ class ItemTableViewController: UIViewController {
39
+
40
+ var itemList: Results<Item>!
41
+ var realm = try! Realm()
42
+
43
+
44
+ override func viewDidLoad() {
45
+ super.viewDidLoad()
46
+
47
+ // 評価対象商品があるか確認
48
+ confirmEvaluationTargetProduct()
49
+
50
+ }
51
+
52
+ private func confirmEvaluationTargetProduct() {
53
+ let items = realm.objects(Item.self)
54
+ let results = select(items: items)
55
+
56
+ if results.count > 0 {
57
+ self.itemList = results
58
+ print("一年以上前のデータがありました:(results.count)個")
32
- アプリ起動時に
59
+ } else {
60
+ self.itemList = items
61
+ print("一年以上前のデータはありません")
62
+ }
63
+ }
64
+
65
+ private func select(items: Results<Item>) -> Results<Item> {
66
+ let dateBefore1Year = Calendar.current.date(byAdding: .year, value: -1, to: Date())!
67
+ let formattedDateBefore1Year = Item.convertDateTypeToString(convertDate: dateBefore1Year)
68
+ print("一年前の日付: (formattedDateBefore1Year)")
69
+
70
+ let result = items.filter("date = %@", formattedDateBefore1Year)
71
+ return result
72
+ }
73
+ }
74
+ ```
75
+
76
+
77
+ ```
78
+ let result = items.filter("date = %@", formattedDateBefore1Year)
79
+ ```
80
+ イコールにすると「ちょうど一年前データの取得」になり、これはうまく動作しました。
81
+ 「一年以上前のデータの取得」の処理に変えようと以下のコードに変更したところエラーが発生。
82
+ ```
83
+ let result = items.filter("date <= %@", formattedDateBefore1Year)
84
+ ```
85
+ `Thread 1: "Operator '<=' not supported for type 'string'"`
86
+
87
+ 文字列の日付は比較できない仕様なのかと思ったのですが、以下のサンプルコードはうまく動作したので原因が特定できません。
88
+ ```Sample
89
+ import UIKit
90
+
91
+ func dateFormat(date: Date) -> String {
92
+ let formatter = DateFormatter()
93
+ formatter.dateStyle = .long
94
+ formatter.timeStyle = .none
95
+ formatter.locale = Locale(identifier: "ja_JP")
96
+ return formatter.string(from: date)
97
+ }
98
+
99
+ let today = Date()
100
+ let dateBefore1Year = Calendar.current.date(byAdding: .year, value: -1, to: today)!
101
+
102
+ let formattedToday = dateFormat(date: today) // "2021年5月20日"
103
+ let formattedDB1Y = dateFormat(date: dateBefore1Year) // "2020年5月20日"
104
+
105
+ print(formattedDB1Y <= formattedToday) // true
106
+
107
+ ```
108
+
109
+ ちなみに文字列に変換してるのは、時間で比較してほしくないからです。
110
+
111
+ ご教授よろしくお願いします。