回答編集履歴

5

微修正

2019/08/20 14:35

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -74,6 +74,8 @@
74
74
 
75
75
  どこをwriteの中に書かないといけないのかわかりずらくなると思いますので。
76
76
 
77
+ 全部writeの中に書くようにしておく方が安全だと思います。
78
+
77
79
 
78
80
 
79
81
  追伸③
@@ -108,11 +110,11 @@
108
110
 
109
111
  @objc dynamic var tripId: Int = 0
110
112
 
111
- @objc var timestamp: Date = Date()
113
+ @objc dynamic var timestamp: Date = Date()
112
114
 
113
- @objc var longitude: Double = 0.0
115
+ @objc dynamic var longitude: Double = 0.0
114
116
 
115
- @objc var latitude: Double = 0.0
117
+ @objc dynamic var latitude: Double = 0.0
116
118
 
117
119
  }
118
120
 
@@ -131,3 +133,11 @@
131
133
  こういうのが一般的だと思います。
132
134
 
133
135
  List<*****>を持たせると、無駄に肥大化したデータを扱わないといけなくなると思います。
136
+
137
+
138
+
139
+ GPXファイルの読み込みも、viewDidLoadや場合によっては違うViewで読み込み、Realmに保存し、
140
+
141
+ 表示はTableViewもしくはMapViewで行うのが普通だと思うので、
142
+
143
+ 別々の場所になると思いますよ。

4

例を追加

2019/08/20 14:35

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -67,3 +67,67 @@
67
67
  writeの中で行う方が安全ですよ。
68
68
 
69
69
  ex) routeItem.route = points とか
70
+
71
+ なぜなら、マネージドオブジェクトの変更なども混ざってくると、
72
+
73
+ どこは外に書いてもOKなのか、
74
+
75
+ どこをwriteの中に書かないといけないのかわかりずらくなると思いますので。
76
+
77
+
78
+
79
+ 追伸③
80
+
81
+ イメージがつきやすいようにサンプルを適当に作ってみました。
82
+
83
+ (一部RouteItem, PointsとなっているのをTrip, GPSPointと読み替えてください)
84
+
85
+
86
+
87
+ ![イメージ説明](522646a022de8f0ce5008e82fd6430a8.png)
88
+
89
+ ```swift
90
+
91
+ class Trip: Object {
92
+
93
+ @objc dynamic var id: Int = 0
94
+
95
+ @objc dynamic var name: String = ""
96
+
97
+ @objc dynamic var start: Date = Date()
98
+
99
+ @objc dynamic var end: Date = Date()
100
+
101
+ @objc dynamic var description: String = ""
102
+
103
+ }
104
+
105
+
106
+
107
+ class GPSPoint: Object {
108
+
109
+ @objc dynamic var tripId: Int = 0
110
+
111
+ @objc var timestamp: Date = Date()
112
+
113
+ @objc var longitude: Double = 0.0
114
+
115
+ @objc var latitude: Double = 0.0
116
+
117
+ }
118
+
119
+ ```
120
+
121
+
122
+
123
+ 例えば、タイ貧乏旅行(id=1)とすると、
124
+
125
+ タイ貧乏旅行でのGPSPointは全部tripId = 1で登録する。
126
+
127
+ MasterViewでタイ貧乏旅行を押したら、tripId=1をDetailViewにpushする。
128
+
129
+ DetailViewではtripId=1で検索をかけて表示をする
130
+
131
+ こういうのが一般的だと思います。
132
+
133
+ List<*****>を持たせると、無駄に肥大化したデータを扱わないといけなくなると思います。

3

微修正

2019/08/20 14:28

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -30,7 +30,11 @@
30
30
 
31
31
  目的の最大値の取得ですが、
32
32
 
33
+ ```swift
34
+
33
- routeItems = realm.objects(RouteItem.self).filter("id == '******'").sorted(byKeyPath: "latitude").first
35
+ let maxLatitude = realm.objects(Point.self).filter("id == '******'").sorted(byKeyPath: "latitude").first
36
+
37
+ ```
34
38
 
35
39
  などで取得できると思います。
36
40
 

2

変更

2019/08/20 05:41

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -1,22 +1,18 @@
1
- (2)(4)で取得できて、(3)で取得できない理由ははっきりと答えられません
1
+ (2)(4)で取得できて、(3)で取得できない理由は公式文書で記載箇所を確認した訳でないです
2
2
 
3
- 通常は、realmに保存したものを呼び出して使うので
3
+ realm.addされるとマネージドオブジェクト(realm側で管理するオブジェクト)なり
4
4
 
5
+ プロパティではなく、辞書型で管理されるってことだと思います。
6
+
5
- realm.addの後にそのまま保存にletで用意したrouteItemを使い続ることはなです。
7
+ なので、管理前(realm.add前)はrouteItem.route[0].latitude(プロパティ)とかたのが、
8
+
9
+ 途端に書けなくなり、辞書型で管理され、routeItem.route[0]["latitude"](辞書型)で表示となるようです。
6
10
 
7
11
 
8
12
 
9
- なので答えになってなような気もしますが
13
+ しかし保存前letで用意したrouteItemをそのまま使い続けることは通常ないので
10
14
 
11
15
  そこを疑問に感じて解決しなくても、登場することはないと思います。
12
-
13
-
14
-
15
- 目的の最大値の取得ですが、
16
-
17
- routeItems = realm.objects(RouteItem.self).filter("id == '******'").sorted(byKeyPath: "latitude").first
18
-
19
- などで取得できると思います。
20
16
 
21
17
 
22
18
 
@@ -29,6 +25,14 @@
29
25
  今回の場合は、RouteItemとList<Point>()のPoint**"s"**に共通IDを持たせて、Listを使わず管理し、
30
26
 
31
27
  それを元にRealm側で検索できるようにする方が便利なのではないかなって思います。
28
+
29
+
30
+
31
+ 目的の最大値の取得ですが、
32
+
33
+ routeItems = realm.objects(RouteItem.self).filter("id == '******'").sorted(byKeyPath: "latitude").first
34
+
35
+ などで取得できると思います。
32
36
 
33
37
 
34
38
 
@@ -54,7 +58,7 @@
54
58
 
55
59
  追伸②、
56
60
 
57
- RealmObjectに値を代入する時、
61
+ RealmObjectに値を代入する時、アンマネージドオブジェクトならできますが、
58
62
 
59
63
  writeの中で行う方が安全ですよ。
60
64
 

1

情報追加

2019/08/20 05:38

投稿

hameji
hameji

スコア1380

test CHANGED
@@ -1,4 +1,26 @@
1
+ (2)(4)で取得できて、(3)で取得できない理由ははっきりと答えられませんが
2
+
3
+ 通常は、realmに保存したものを呼び出して使うので、
4
+
5
+ realm.addの後にそのまま保存前にletで用意したrouteItemを使い続けることはないです。
6
+
7
+
8
+
9
+ なので、答えになってないような気もしますが、
10
+
11
+ そこを疑問に感じて解決しなくても、登場することはないと思います。
12
+
13
+
14
+
15
+ 目的の最大値の取得ですが、
16
+
17
+ routeItems = realm.objects(RouteItem.self).filter("id == '******'").sorted(byKeyPath: "latitude").first
18
+
19
+ などで取得できると思います。
20
+
21
+
22
+
1
- RealmのListは使い勝手が少し悪い印象です。
23
+ RealmのListは使い勝手が少し悪い印象で
2
24
 
3
25
  SQLなどと違い、RealmObjectのList以下を条件検索とか並び替えが簡単にできないからです。
4
26
 
@@ -26,7 +48,7 @@
26
48
 
27
49
  privateなメンバー変数にしておいた方が便利ですよ。
28
50
 
29
- そうすると、private var realm: Realm!が不要になります
51
+ private var realm: Realm!と入れ替えを
30
52
 
31
53
 
32
54