如何将 MKMapItem 转换为二进制数据以存储在 Core Data 中?

Posted

技术标签:

【中文标题】如何将 MKMapItem 转换为二进制数据以存储在 Core Data 中?【英文标题】:How to convert MKMapItem to binary data to store in Core Data? 【发布时间】:2019-03-05 23:23:20 【问题描述】:

我想将之前由 MKLocalSearch 找到的 MKMapItem 存储在 Core Data 中,以便将来在视图加载时将其显示给用户。

我在 xcdatamodeld 文件中创建了一个实体,并创建了一个名为 mapItem 的 binaryData 属性。

我想将找到的 MKMapItem 编码为二进制数据并存储在核心数据中。

稍后我想将其解码为 MKMapItem。

我注意到 MKMapItem 有一个需要 NSCoder 对象的 encode 方法。

我对 NSCoding 不是很熟悉,因此我们将不胜感激。

我总是可以通过为实体创建多个属性来将来自 MKMapItem 的字符串属性保存在核心数据中,但我想知道是否有简单的方法。

谢谢!

【问题讨论】:

如果只用Core Data保存位置,用前者重构对应的MKMapItem对象,不是更简单吗? 【参考方案1】:

我想通了。为了将 MapItem 存储在 Core Data 中,我使用了 NSKeyedArchiver。 它将 MapItem 编码为 Data 并进行解码,您可以使用 NSKeyedUnarchiver

func saveMapItems(_ mapItems: [MKMapItem]) 
    do 
        let data = try NSKeyedArchiver.archivedData(withRootObject: mapItems, requiringSecureCoding: false)
        let request: NSFetchRequest<RecentSearchLocation> = RecentSearchLocation.fetchRequest()
        if
            let recentLocations = try? coreDataManager.persistentContainer.viewContext.fetch(request).first,
            let location = recentLocations 
            location.mapItems = data
         else 
            let location = RecentSearchLocation(context: coreDataManager.persistentContainer.viewContext)
            location.mapItems = data
        
     catch 
        print("Can't encode data: \(error)")
    
    do 
        try coreDataManager.persistentContainer.viewContext.save()
     catch 
        print("Error saving context \(error)")
    

为了解码我做了这个

func readMapItems() -> [MKMapItem] 
        let request: NSFetchRequest<RecentSearchLocation> = RecentSearchLocation.fetchRequest()
        guard
            let data = try? coreDataManager.persistentContainer.viewContext.fetch(request).first?.mapItems,
            let dataToUnarchive = data else 
                print("Cannot get mapItems from coreData data")
                return []
        
        do 
            guard let recentSearchLocations = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dataToUnarchive) as? [MKMapItem] else 
                return []
            
            return recentSearchLocations
         catch 
            print("Error unarchiving mapItems, \(error)")
            return []
        
    

【讨论】:

以上是关于如何将 MKMapItem 转换为二进制数据以存储在 Core Data 中?的主要内容,如果未能解决你的问题,请参考以下文章

MKPointAnnotation 到 MKMapItem

为啥mongodb以base64的形式存储二进制数据?

java如何把一个以文本存储的文件转化为二进制文件

JAVA如何将二进制数转换成文件?

在 Swift 中将 CLLocation 转换为 MKMapItem

如何从 MKMapItem 中提取纬度/经度坐标