在 CoreData (Swift) 中存储位置

Posted

技术标签:

【中文标题】在 CoreData (Swift) 中存储位置【英文标题】:Store location in CoreData (Swift) 【发布时间】:2016-09-16 11:23:38 【问题描述】:

我正在尝试从JSON 中找出如何在CoreData 中存储位置。 我正在使用此代码从JSON api 获取数据并尝试将其存储在我的CoreData

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext
let newPok = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context)

for jsonItem in json    
    let item = jsonItem as! NSDictionary

    let pokemonName = item["name"]
    let pokemonDesc = item["description"]
    let pokemonLat = (item["location"] as! NSDictionary) ["latitude"]
    let pokemonLon = (item["location"] as! NSDictionary) ["longitude"]

    let coordinates = CLLocationCoordinate2D(latitude: pokemonLat as! CLLocationDegrees, longitude: pokemonLon as! CLLocationDegrees)

    let annotation = MKPointAnnotation()

    annotation.title = pokemonName as! String?
    annotation.subtitle = pokemonDesc as! String?

    annotation.coordinate = coordinates

    self.map.addAnnotation(annotation)

    newPok.setValue(pokemonName as! String, forKey: "name")
    newPok.setValue(pokemonDesc as! String, forKey: "desc")
    newPok.setValue(pokemonLat as! String, forKey: "lat")
    newPok.setValue(pokemonLon as! String, forKey: "lon")

    do 
        try context.save()
     catch 
        print("not saved")
    

但是当我运行这段代码时,我总是得到一个fatal exception

error Domain=NSCocoaErrorDomain Code=134190 "(null)" UserInfo=entity=Person, property=lat, reason=Source and destination attribute types are incompatible

我的数据库有一个包含 4 个字符串的设置(名称、desc、lat、long)

有人知道我在这里做错了什么吗?

亲切的问候,

约翰

【问题讨论】:

核心数据中lat 的类型? 类型是字符串。但我认为这是不正确的 那个缩进虽然... o.0 你的意思是你的CoreData实体包含四个字符串属性吗?如果是这样,请检查 pokemanLat 和 pokemanLon,您到达那里的类型是什么? 是的,字符串是所有属性的属性。我想我得到了一本字典,因为我将变量转换为 NSDictionary 【参考方案1】:

您需要将Lat和Long属性的数据类型从String更改为Integer16

【讨论】:

感谢您的回答!我是否需要将我的变量(pokemonlat、pokemonlon)转换为其他变量?还是字符串足够好 你必须将它们都从字符串转换为整数或数字【参考方案2】:

好吧,我想通了。

我将核心数据属性从string 更改为double,在我的代码中我做了pokemonLat as! Double?。那行得通。

感谢你们的帮助!应用它!

【讨论】:

只有在您 100% 确定来自服务器的 JSON 响应包含纬度/经度 AS 编号,而不是作为字符串括在引号中的情况下才有效。否则你会崩溃。所以也许写这样的东西会更好: let lat: Double? = 字典["lat"].flatMap Double($0)

以上是关于在 CoreData (Swift) 中存储位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite 或 CoreData 中保存位置坐标,并在 swift 中进行重要的位置监控

iOS swift:使用 coredata (cloudkit) 存储缓存

Swift 从 CoreData 转换为 CoreLocation - 有一些问题

在 CoreData 数据库中存储包含 CGPoints 的数组(Swift)

如何在 Swift 中将位置面包屑保存到 CoreData

Swift学习笔记-《PRODUCT》读书记录-CoreData数据存储