34 Stimmen

Wie speichert man CLLocation mit Core Data (iPhone)?

Ich versuche, einen Standort zu speichern und ihn anschließend auf einer Karte abzurufen, indem ich die Frameworks Core Location, MapKit und Core Data verwende.

Was ich getan habe, ist ich gerade gemacht Entität namens POI und fügte Eigenschaften wie Breitengrad (double-Typ), Längengrad (double-Typ) mit wenigen anderen.

Einfach ausgedrückt, speichert meine App POI mit zwei NSNummern. (Breiten- und Längengrad), aber ich denke, es muss einen intelligenteren Weg geben, um CLLocation als das zu speichern.

Prost.

36voto

nevan king Punkte 110579

Was Sie tun, ist in Ordnung. Sie sollten den Breiten- und Längengrad als Doppelwerte in den Kerndaten speichern. Wenn Sie die Informationen wieder benötigen, holen Sie die Doubles aus Core Data zurück und konstruieren eine CLLocationCoordinate2D Struktur mit einer Funktion wie CLLocationCoordinate2DMake . Es gibt keine eingebaute Möglichkeit, einen Standort zu speichern, so dass die Speicherung der Komponenten Breitengrad und Längengrad ausreicht.

Wenn Sie keine mathematischen Operationen mit den Breiten- oder Längengraden durchführen (z. B. Bounding Boxes finden), können Sie sie als Strings speichern. Floats und Doubles können ihre Werte leicht verändern, so dass Vergleichsoperationen fehlschlagen.

29voto

TechZen Punkte 64117

CLLocation implementiert das NSCoding-Protokoll, so dass Sie sie in Core Data als transformierbare Attribute speichern können. Sie können den Standardwerttransformator NSKeyedUnarchiveFromData verwenden.

Sie würden einfach das CCLocation-Objekt an das verwaltete Objektattribut übergeben, das es in Daten serialisiert und als Blob im SQL-Speicher speichert. Wenn Sie das Ortsobjekt wieder benötigen, wird der Prozess automatisch umgekehrt und Sie erhalten ein vollständig ausgefülltes CCLocation-Objekt zurück.

Das könnte der einfachste Weg sein, um zu bekommen, was Sie wollen.

19voto

tc. Punkte 33176

Die "beste" Art der Aufbewahrung hängt davon ab, was Sie damit machen wollen:

  • Wenn Sie die "gleiche" CLLocation wollen, serialisieren Sie sie. NSKeyedUnarchiveFromData ist in Ordnung.
  • Wenn Sie nur nach Breiten- und Längengraden suchen wollen, speichern Sie diese als Doppelwerte (und aktivieren Sie das Kontrollkästchen "indiziert").

Es gibt eine Reihe zusätzlicher Eigenschaften, die Sie speichern bzw. wiederherstellen können, wenn Sie dies manuell tun (Höhe, horizontalAccuracy, verticalAccuracy, Zeitstempel). Es gibt einige weitere, die man nicht speichern kann (Geschwindigkeit, Kurs); CLLocation bietet keine geeignete init-Methode und die Eigenschaften sind schreibgeschützt.

All diese zusätzlichen Eigenschaften sind nützlich, wenn Sie einen Track aufnehmen wollen. Die Höhe ist nützlich, wenn Sie einen POI in bergigem Gelände aufzeichnen ("wir müssen noch 100 m aufsteigen"). Die horizontale/vertikale Genauigkeit kann verwendet werden, um darzustellen, wie groß der POI ist (z. B. könnte eine Stadt eine "horizontale Genauigkeit" von mehreren km haben und als großer Kreis angezeigt werden).

1voto

Chris Morse Punkte 306

Sie können dies ganz einfach tun, indem Sie den Attributtyp Kerndaten auf Transformable . Der Standardtransformator, wenn Sie die Option Werttransformator Name leer ist NSKeyedArchiver die mit den meisten Foundation-Typen wie NSURL und CLLocation funktioniert.

0voto

PostCodeism Punkte 1050

Sie brauchen NSNumber nicht zu verwenden, um Breiten- und Längengradpunkte zu speichern. Stattdessen können Sie CLLocation direkt in den Kerndaten speichern.

Richten Sie für jeden CLLocation eine Entität ein, die eine too-many-Beziehung zu der Entität ist, die die Ortspunkte verwendet. Nennen wir sie LocationPoint:

class LocationPoint: NSManagedObject {

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

}

Sie setzen dann die Standort Eigenschaft im Xcode-Datenmodell auf transformierbar. Das war's!

In Objective-C können Sie diese LocationPoint-Eigenschaft tatsächlich noch als CLLocation deklarieren, ohne dass Fehler auftreten:

@property (nonatomic, strong) CLLocation *location

Mehr Informationen hier .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X