将位置坐标保存到Core数据-Swift 3 [英] Saving location coordinates to Core data- Swift 3

查看:114
本文介绍了将位置坐标保存到Core数据-Swift 3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to save location coordinates into Core Data- what is the right way of storing these and retrieving them?

此刻,我正在这样做并遇到错误:

At the moment I am doing this and getting errors:

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

我通过使用自动完成小部件使用Google Maps API来获得坐标。

I get my coordinates from using Google maps API using the autocomplete widget.

    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

然后存储我使用的坐标:

Then to store the coordinates I use:

      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中进行检索:

And I have the attributes all set as String types. Then to retrieve in my ViewDidLoad I have:

      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
                }

因此,这无法正常工作并产生属性:属性错误 =坐标;所需的类型= NSString;给定类型= NSConcreteValue。我有几个问题。

So this is not working and producing an error of 'attribute: property = "coordinate"; desired type = NSString; given type = NSConcreteValue'. I have a few questions.

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

How do I save a coordinate data appropriately? Do I save it as a CLLocationDegrees or CLLocationCoordinate2D? How do I convert these objects into NSString or should I be using a different type in my attributes? (I tried changing it to Double or Integer but it also produced errors). I have multiple location coordinates which I would want to store and retrieve from core data.

推荐答案

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

If you are going to deal with lots of data, then CoreData is the best bet.

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

These are my attributes in StorePlace entity, its best to save only latitude and longitude and create coordinates from them when needed in your implementation.

@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)
    }
}

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

After retrieving latitude, longitude you can use coordinate in your implementations as

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

这篇关于将位置坐标保存到Core数据-Swift 3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆