将位置坐标保存到核心数据 - Swift 3
Saving location coordinates to Core data- Swift 3
我想将位置坐标保存到核心数据中 - 存储和检索它们的正确方法是什么?
目前我正在执行此操作并遇到错误:
var newPlaceCoordinate = CLLocationCoordinate2D()
var newPlaceLatitude = CLLocationDegrees()
var newPlaceLongitude = CLLocationDegrees()
我通过 Google 地图 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")
并且我将所有属性都设置为字符串类型。
然后在我的 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"; desired type = NSString; given type = NSConcreteValue' 的错误。我有几个问题。
如何正确保存坐标数据?
我将其保存为 CLLocationDegrees 还是 CLLocationCoordinate2D?
如何将这些对象转换为 NSString 或我应该在我的属性中使用不同的类型? (我尝试将其更改为 Double 或 Integer 但它也产生了错误)。我有多个位置坐标,我想从核心数据中存储和检索这些坐标。
您需要将坐标转换为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 中的二进制类型。
如果您要处理大量数据,那么 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)
我想将位置坐标保存到核心数据中 - 存储和检索它们的正确方法是什么?
目前我正在执行此操作并遇到错误:
var newPlaceCoordinate = CLLocationCoordinate2D()
var newPlaceLatitude = CLLocationDegrees()
var newPlaceLongitude = CLLocationDegrees()
我通过 Google 地图 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")
并且我将所有属性都设置为字符串类型。 然后在我的 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"; desired type = NSString; given type = NSConcreteValue' 的错误。我有几个问题。
如何正确保存坐标数据? 我将其保存为 CLLocationDegrees 还是 CLLocationCoordinate2D? 如何将这些对象转换为 NSString 或我应该在我的属性中使用不同的类型? (我尝试将其更改为 Double 或 Integer 但它也产生了错误)。我有多个位置坐标,我想从核心数据中存储和检索这些坐标。
您需要将坐标转换为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 中的二进制类型。
如果您要处理大量数据,那么 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)