将位置坐标保存到Core数据 - Swift 3

时间:2016-12-30 14:38:05

标签: ios swift core-data nsstring cllocation

我想将位置坐标保存到Core Data中 - 存储这些内容并检索它们的正确方法是什么?

目前我正在这样做并收到错误:

    var newPlaceCoordinate = CLLocationCoordinate2D()
      var newPlaceLatitude = CLLocationDegrees()
     var newPlaceLongitude = CLLocationDegrees()

我使用自动填充小部件来使用Google maps API来获取坐标。

    let newPlaceCoordinate = place.coordinate
  self.newPlaceCoordinate = place.coordinate
    let newPlaceLatitude = place.coordinate.latitude
    print(newPlaceLatitude)
   self.newPlaceLatitude = place.coordinate.latitude
    let newPlaceLongitude = place.coordinate.longitude
    print(newPlaceLongitude)
self.newPlaceLongitude = place.coordinate.longitude

然后存储我使用的坐标:

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let newPlace = NSEntityDescription.insertNewObject(forEntityName: "StoredPlace", into: context)
     newPlace.setValue(newPlaceCoordinate, forKey: "coordinate")
    newPlace.setValue(newPlaceLatitude, forKeyPath: "latitude")
    newPlace.setValue(newPlaceLongitude, forKeyPath: "longitude")

我将所有属性都设置为String类型。 然后在我的ViewDidLoad中检索我:

      let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "StoredPlace")

    request.returnsObjectsAsFaults = false
    if let coordinate = result.value(forKey: "coordinate") as? String

           {
                 let latitude = (coordinate as NSString).doubleValue
                    let longitude = (coordinate as NSString).doubleValue
                    let markers = GMSMarker()
                    markers.position = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
                    markers.icon = GMSMarker.markerImage(with: UIColor.yellow)
                    markers.tracksViewChanges = true
                    markers.map = vwGMap
                }

所以这不起作用并产生'attribute:property =“coordinate”的错误;期望的类型= NSString;给定type = NSConcreteValue'。我有几个问题。

如何正确保存坐标数据? 我将其保存为CLLocationDegrees还是CLLocationCoordinate2D? 如何将这些对象转换为NSString,还是应该在属性中使用不同的类型? (我尝试将其更改为Double或Integer但它也会产生错误)。我有多个位置坐标,我想从核心数据存储和检索。

2 个答案:

答案 0 :(得分:2)

如果您打算处理大量数据,那么CoreData是最好的选择。

这些是StorePlace实体中的属性,最好只保存纬度和经度,并在实施时需要时从中创建坐标。

@NSManaged public var newPlaceLatitude: Double
@NSManaged public var newPlaceLongitude: Double

要插入新数据,我会做

class func insert(latitude: Double, longitude: Double) {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedObjectContext = appDelegate.managedObjectContext

    let entity =  NSEntityDescription.entity(forEntityName: "StoredPlace", in:managedObjectContext)
    let newItem = StoredPlace(entity: entity!, insertInto: managedObjectContext)

    newItem.newPlaceLatitude = latitude
    newItem.newPlaceLongitude = longitude

    do {
        try managedObjectContext.save()
    } catch {
        print(error)
    }
}

检索纬度,经度后,您可以在实现中使用坐标

let newItem = getCoordinateFromCoreData() // your retrieval function
let coordinate = CLLocationCoordinate2D(latitude: newItem.latitude, longitude: newItem.longitude)

答案 1 :(得分:0)

您需要将坐标转换为double / NSdata类型,然后将其存储在CoreData中。使用NSKeyedArchiver和NSKeyedUnarchiver存储和检索值。 CoreData不能直接存储CLLocation对象。

// Convert CLLocation object to Data
let newPlaceLatitudeArchived = NSKeyedArchiver.archivedDataWithRootObject(newPlaceLatitude)
//CoreData Piece
newPlace.setValue(newPlaceLatitudeArchived, forKeyPath: "latitude")

// fetch the latitude from CoreData as Archive object and pass it to unarchive to get the CLLocation

let newPlaceLatitudeUnArchived = NSKeyedUnarchiver.unarchiveObjectWithData(archivedLocation) as? CLLocation 

在这种情况下,您需要在CoreData中将属性转换为二进制类型。