如何将 MKMapItem 转换为二进制数据存储在 Core Data 中?
How to convert MKMapItem to binary data to store in Core Data?
我想存储之前由 MKLocalSearch 在 Core Data 中找到的 MKMapItem,以便我可以在将来加载视图时将其显示给用户。
我所拥有的是我在 xcdatamodeld 文件中创建了一个实体并创建了一个名为 mapItem 的 binaryData 属性。
我想把找到的MKMapItem编码成二进制数据存入core data
稍后我想将其解码为 MKMapItem。
我注意到 MKMapItem 有一个需要 NSCoder 对象的编码方法。
我对 NSCoding 不是很熟悉所以任何帮助将不胜感激。
我总是可以通过为实体创建多个属性来将 MKMapItem 的字符串属性保存在核心数据中,但我想知道是否有简单的方法。
谢谢!
我明白了。为了将 MapItem 存储在核心数据中,我使用了 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 []
}
}
我想存储之前由 MKLocalSearch 在 Core Data 中找到的 MKMapItem,以便我可以在将来加载视图时将其显示给用户。
我所拥有的是我在 xcdatamodeld 文件中创建了一个实体并创建了一个名为 mapItem 的 binaryData 属性。
我想把找到的MKMapItem编码成二进制数据存入core data
稍后我想将其解码为 MKMapItem。
我注意到 MKMapItem 有一个需要 NSCoder 对象的编码方法。
我对 NSCoding 不是很熟悉所以任何帮助将不胜感激。
我总是可以通过为实体创建多个属性来将 MKMapItem 的字符串属性保存在核心数据中,但我想知道是否有简单的方法。
谢谢!
我明白了。为了将 MapItem 存储在核心数据中,我使用了 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 []
}
}