如何从CoreData中检索经度和纬度

时间:2017-09-18 07:43:27

标签: ios swift core-data core-location

我有这个代码,我可以保存从地图视图坐标获取的纬度和经度。当应用程序启动时,我想检索这些坐标。我确实注意到,但是当我尝试检索它时,我得到的信息比我想要的要多得多。

我使用此方法检索它,并将其打印在控制台上:

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "GeoData")
    request.returnsObjectsAsFaults = false
    do
    {
        let results = try context.fetch(request)

        if results.count > 0 {
            print(results)
        }
    }
    catch
    {
        //ERROR    
    }

但是当我这样做时,我明白了:

 [<GeoData: 0x6000002876c0> (entity: GeoData; id: 0xd0000000014c0000 <x-coredata://1BDB903D-6F82-404A-A381-832E7932F832/GeoData/p83> ; data: {
    myLastLocation = nil;
    myLatitude = "24.16935894001965";
    myLongitude = "120.9677266312395";
})]

如何再次检索数据并获得myLatitude和myLongitude的真实值?

编辑:

这是我保存它的方式:

       if longPress.state == .ended 
       { 
        let touchLocation = longPress.location(in: mapView)
        let coordinate = mapView.convert(touchLocation, toCoordinateFrom: mapView)
        let newLocation = NSEntityDescription.insertNewObject(forEntityName: "GeoData", into: context)
        newLocation.setValue(coordinate.latitude  as Double, forKey: "myLatitude")
        newLocation.setValue(coordinate.longitude as Double, forKey: "myLongitude")
        do
        {
            try context.save()
        }
        catch
        {
            //ERROR
        }
       }

3 个答案:

答案 0 :(得分:0)

阅读更新后的问题:

您只需要使用正确的类型声明NSFetchRequest。 我从我的代码中挑选了一些陈述(Brand是我项目中的一个模型)。

....
    let brandRequest = NSFetchRequest<Brand>(entityName: "Brand")

    do {
                let matches = try mycontext.fetch(brandRequest)
                return matches
            }catch let error as NSError {
                ...
            }

在这种情况下,您返回的匹配项是&#34;品牌&#34;对象

而且,如果您的数据模型具有许多属性,并且您只需要经度和纬度,则可以尝试NSFetchRequest.propertiesToFetch。这是我的第一个答案意味着......

答案 1 :(得分:0)

你应该像

一样
    do
    {
        let results = try context.fetch(request) as! GeoData

        if results.count > 0 {
            print("\(results.myLatitude)) & \(results.myLongitude)")
        }
    }
    catch
    {
        //ERROR    
    }

答案 2 :(得分:0)

我找到了解决方案:

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "GeoData")
    request.returnsObjectsAsFaults = false
    do
    {
        let results = try context.fetch(request) as! [NSManagedObject]
        if results.count > 0 {
            for result in results {
                if let latitude = result.value(forKey: "myLatitude") as? Double {
                    print(latitude)
                }
                if let longitude = result.value(forKey: "myLongitude") as? Double {
                    print(longitude)
                }
            }
        }
    }
    catch
    {
        //ERROR
    }

这个正确地打印出纬度和经度而没有额外的信息。

19.7440716117355
129.099291435423