wake-up-neo.com

Wie speichere ich CLLocation mit Core Data (iPhone)?

Ich versuche, einen Standort zu speichern und den Standort anschließend mithilfe der Frameworks Core Location, MapKit und Core Data auf einer Karte abzurufen.

Was ich getan habe, ist, dass ich gerade ein Objekt mit dem Namen POI erstellt und Eigenschaften wie Breitengrad (doppelter Typ), Längengrad (doppelter Typ) mit wenigen anderen hinzugefügt habe.

Einfach ausgedrückt, meine App speichert den POI mit zwei NSNumbers. (Lat und Long), aber ich glaube, es muss eine intelligentere Möglichkeit geben, CLLocation zu speichern.

prost.

33
bicbac

Was du tust, ist gut. Sie sollten den Breiten- und Längengrad in Core Data als Doppelwerte speichern. Wenn Sie die Informationen erneut abrufen müssen, holen Sie die Doubles von Core Data zurück und konstruieren Sie eine CLLocationCoordinate2D-Struktur mit einer Funktion wie CLLocationCoordinate2DMake. Es gibt keine eingebaute Möglichkeit zum Speichern eines Standorts. Das Speichern der Breiten- und Längengrade ist daher ausreichend.

Wenn Sie keine mathematischen Operationen auf dem Breiten- oder Längengrad ausführen (Begrenzungsfelder suchen usw.), können Sie sie als Zeichenfolgen speichern. Floats und Doubles können ihre Werte leicht ändern, wodurch Vergleichsoperationen fehlschlagen.

35
nevan king

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

Sie übergeben das CCLocation-Objekt einfach an das verwaltete Objektattribut, und es serialisiert es in Daten und speichert es als Blob im SQL-Speicher. Wenn Sie das Standortobjekt wieder benötigen, wird der Prozess automatisch rückgängig gemacht und ein vollständig gefülltes CCLocation-Objekt an Sie zurückgegeben. 

Das ist vielleicht der einfachste Weg, um zu bekommen, was Sie wollen. 

27
TechZen

Die "beste" Art, es zu speichern, hängt davon ab, was Sie damit machen wollen:

  • Wenn Sie dieselbe CLLocation wünschen, serialisieren Sie sie. NSKeyedUnarchiveFromData ist in Ordnung.
  • Wenn Sie nur nach Längen- und Breitengrad suchen möchten, speichern Sie diese als Doubles (und aktivieren Sie das Kontrollkästchen "indiziert").

Es gibt eine Reihe zusätzlicher Eigenschaften, die Sie speichern/wiederherstellen können, wenn Sie dies manuell tun (Höhe, horizontale Genauigkeit, vertikale Genauigkeit, Zeitstempel). Es gibt noch mehr, die Sie nicht können (Geschwindigkeit, Kurs). CLLocation bietet keine geeignete init-Methode und die Eigenschaften sind schreibgeschützt.

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

17
tc.

Sie können dies ganz einfach tun, indem Sie den Attributstyp "Core Data" auf Transformable setzen. Wenn Sie den Value Transformer Name leer lassen, ist der Standardtransformer NSKeyedArchiver, der mit den meisten Foundation-Typen wie NSURL und CLLocation funktioniert.

2
Chris Morse

Sie müssen NSNumber nicht verwenden, um Breiten- und Längengrade zu speichern. Sie können CLLocation stattdessen direkt in den Kerndaten speichern. 

Richten Sie für jede CLLocation eine Entität ein. Dies ist eine zu viele Beziehung zu der Entität, die Standortpunkte verwendet. Nennen wir diesen LocationPoint:

class LocationPoint: NSManagedObject {

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

}

Anschließend setzen Sie die Eigenschaft location im Xcode-Datenmodell auf umwandelbar. Das ist es!

In Objective-c können Sie diese LocationPoint-Eigenschaft dennoch ohne Fehler als CLLocation deklarieren:

@property (nonatomic, strong) CLLocation *location

Mehr Infos hier .

0
PostCodeism