我有一个名为 Places 的实体和一个可转换的属性(placeMark)。当我关闭应用程序并重新启动它时遇到问题,它查询 CoreData 并且记录在那里,但是每个地方的时间戳完全相同。
**写入CoreData的代码**
private func store(_ location: CLLocation) {
if let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext {
let newData = Places(context: context)
CLGeocoder().reverseGeocodeLocation(location, completionHandler:
{ (placeMarks, error) in
if (error != nil) {
print("reverse geodcode fail: \(error!.localizedDescription)")
}
let placeMark = placeMarks! as [CLPlacemark]
if placeMark.count > 0 {
// add to the database
newData.placeMark = placeMark[0]
print(newData.placeMark?.location?.timestamp as Any)
self.places.append(newData)
self.lastPlaceForAllLocations = newData
}
//Save the context
(UIApplication.shared.delegate as? AppDelegate)?.saveContext()
// test if this works if we clear all placemarks
//self.getLocationFromDatabase()
})
}
}
一旦我得到一个位置(ClLocation),我就可以存储、擦除我的上下文并读回时间(不同的时间戳)。我使用下面的代码来读取数据库。
**从 CoreData 读取的核心 **
private func getLocationFromDatabase() {
places.removeAll()
if let context = (UIApplication.shared.delegate as? AppDelegate)?
.persistentContainer.viewContext {
let request: NSFetchRequest<Places> = Places.fetchRequest()
/*let sort = NSSortDescriptor(key: "placeMark.location.timestamp", ascending: false)
request.sortDescriptors = [sort]*/
if let placesCoreData = try?
context.fetch(request) {
if let placesHere = placesCoreData as? [Places] {
print(placesHere)
for item in placesHere {
print(item.placeMark?.location?.timestamp)
self.places.append(item)
}
lastPlaceForAllLocations = places.last
// TODO
//tableView.reloadData()
}
}
}
lastPlaceForAllLocations = places.first
}
我尝试存储一个地标,然后我清除我的缓冲区并读取它并没问题(我可以看到两个具有不同时间戳的地方),但是一旦再次启动应用程序,我就可以读取以读取两个地标,但它们有相同的时间戳。
任何帮助,将不胜感激!