核心数据中的路线和行程之间存在一对多关系(每次行程必须遵循一条路线,但同一路线上可能会有很多行程)。有40条路线和几千次旅行。
此时路由已经插入并保存了上下文,现在我正在尝试根据id获取路由,以便我可以将它们链接到行程。
for trip in trips {
let id = Int(trip[0]) ?? 0
let direction = Int(trip[1]) ?? 0
let routeId = trip[2]
let newTrip = NSEntityDescription.insertNewObject(forEntityName: "Trip", into: context)
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Route")
fetchRequest.predicate = NSPredicate(format: "id == %@", routeId)
do {
let routes = try context.fetch(fetchRequest) // 1
print("\(routes.count) routes") // 2
let route = routes[0] as! NSManagedObject
newTrip.setValue(id, forKey: "id")
newTrip.setValue(direction, forKey: "direction")
newTrip.setValue(route, forKey: "route")
} catch {
print(error)
}
}
第一次通过循环是好的,但在第二次通过我得到一些奇怪的行为。我为核心数据启用了调试,第1行和第2行在控制台中打印以下内容:
CoreData: annotation: total fetch execution time: 0.0026s for 1 rows.
0 routes
所以SQLite Query返回1行,但是当我尝试通过核心数据访问它时,它不存在,所以我的应用程序崩溃了。知道为什么会这样吗?