web-dev-qa-db-ja.com

コアデータ(iPhone)を使用してCLLocationを保存する方法

Core Location、MapKit、Core Dataフレームワークを使用して、場所を保存し、後で地図上の場所を取得しようとしています。

私がやったことは、POIという名前のエンティティを作成し、緯度(ダブルタイプ)、経度(ダブルタイプ)などのプロパティを追加しただけです。

簡単に言えば、私のアプリは2つのNSNumbersでPOIを保存します。 (緯度と経度)しかし、それよりもCLLocationを格納するためのよりスマートな方法があるはずだと思います。

乾杯。

34
bicbac

あなたがやっていることは結構です。緯度と経度は、コアデータに2倍として保存する必要があります。情報を再度取得する必要がある場合は、Core Dataからdoubleを取得し、CLLocationCoordinate2Dのような関数を使用してCLLocationCoordinate2DMake構造体を構築します。場所を保存するための組み込みの方法はないため、緯度と経度のコンポーネントを保存するのが適切です。

緯度または経度で算術演算を行わない場合(境界ボックスを見つけるなど)、それらを文字列として保存できます。 floatとdoubleは値をわずかに変更する可能性があり、比較演算が失敗します。

35
nevan king

CLLocationはNSCodingプロトコルを実装しているため、変換可能な属性としてコアデータに格納できます。デフォルトのNSKeyedUnarchiveFromData値トランスフォーマーを使用できます。

CCLocationオブジェクトを管理オブジェクト属性に渡すだけで、データにシリアル化され、SQLストアにBLOBとして保存されます。位置オブジェクトを戻す必要がある場合は、自動的にプロセスを逆にして、完全に入力されたCCLocationオブジェクトに戻ります。

それはあなたが望むものを得るための最も簡単な方法かもしれません。

27
TechZen

それを保存する「最良の」方法は、それをどうしたいかによって異なります。

  • 「同じ」CLLocationが必要な場合は、シリアル化します。 NSKeyedUnarchiveFromDataは問題ありません。
  • 緯度と経度のみを検索する場合は、それらをdoubleとして保存します(「インデックス付き」チェックボックスをオンにします)。

手動で行う場合に保存/復元できる追加のプロパティがたくさんあります(高度、水平精度、垂直精度、タイムスタンプ)。あなたができないこと(速度、見出し)がいくつかあります。 CLLocationは適切なinitメソッドを提供せず、プロパティは読み取り専用です。

追加のプロパティはすべて、トラックを録音する場合に役立ちます。標高は、山岳地帯でPOIを記録する場合に便利です(「100 m登る必要があります」)。水平/垂直精度は、POIの大きさを表すために使用される場合があります(たとえば、都市の「水平精度」は数kmで、大きな円として表示される場合があります)。

17
tc.

Core Data属性タイプをTransformableに設定するだけで、これを非常に簡単に行うことができます。 Value Transformer Nameを空白のままにした場合のデフォルトのトランスフォーマーはNSKeyedArchiverであり、NSURLやCLLocationなどのほとんどのFoundationタイプで機能します。

2
Chris Morse

緯度と経度のポイントを格納するためにNSNumberを使用する必要はありません。代わりに、CLLocationをコアデータに直接保存できます。

CLLocationごとにエンティティを設定します。これは、ロケーションポイントを使用しているエンティティから離れた多すぎる関係になります。これをLocationPointと呼びましょう:

class LocationPoint: NSManagedObject {

@NSManaged var game: NSNumber
@NSManaged var time: NSDate
@NSManaged var location: AnyObject

}

次に、locationプロパティをXcodeデータモデルで変換可能に設定します。それでおしまい!

Objective-cでは、実際にこのLocationPointプロパティをエラーなしでCLLocationとして宣言できます。

@property (nonatomic, strong) CLLocation *location

詳細はこちら

0
PostCodeism