1

我有一个名为 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
  }

我尝试存储一个地标,然后我清除我的缓冲区并读取它并没问题(我可以看到两个具有不同时间戳的地方),但是一旦再次启动应用程序,我就可以读取以读取两个地标,但它们有相同的时间戳。

任何帮助,将不胜感激!

4

0 回答 0