Swift 核心数据获取返回空数组,但调试显示返回SQLite行?
我在核心数据中的路线和行程之间有一对多的关系(每次行程必须遵循一条路线,但同一条路线上可能有许多行程)。有40条路线和几千次行程 此时,已经插入了路由并保存了上下文,现在我尝试根据id获取路由,以便将它们链接到tripsSwift 核心数据获取返回空数组,但调试显示返回SQLite行?,swift,xcode,sqlite,core-data,Swift,Xcode,Sqlite,Core Data,我在核心数据中的路线和行程之间有一对多的关系(每次行程必须遵循一条路线,但同一条路线上可能有许多行程)。有40条路线和几千次行程 此时,已经插入了路由并保存了上下文,现在我尝试根据id获取路由,以便将它们链接到trips for trip in trips { let id = Int(trip[0]) ?? 0 let direction = Int(trip[1]) ?? 0 let routeId = trip[2] let
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)
}
}
所以SQLite查询返回1行,但是当我试图通过核心数据访问它时,它不在那里,所以我的应用程序崩溃了。你知道为什么会发生这种情况吗?你的应用程序崩溃了,因为你正试图将let route=routes[0]的不存在的值展开为!NSManagedObject。如果let route=routes.first as使用?NSManagedObject。至少你的应用不会再崩溃了。您还应该检查routeId。您确定该值与数据库中现有的route.id相同吗?我知道它崩溃的原因,但它不应该为零,如果它是零,那么其他任何东西都不会起作用,所以现在我希望它崩溃。在循环的第一次和第二次迭代中,路由id是相同的,在控制台中,我可以看到它在崩溃之前找到了正确的路由。一个解释是,获取的
路由已在上下文中删除(但该删除尚未保存到存储中)。我从来没有发现什么错误,但是我重写了我程序的这一部分(代码看起来基本相同),然后它工作得很好。你的应用程序崩溃了,因为你正试图将let route=routes[0]的不存在值解包为!NSManagedObject。如果let route=routes.first as使用?NSManagedObject。至少你的应用不会再崩溃了。您还应该检查routeId。您确定该值与数据库中现有的route.id相同吗?我知道它崩溃的原因,但它不应该为零,如果它是零,那么其他任何东西都不会起作用,所以现在我希望它崩溃。在循环的第一次和第二次迭代中,路由id是相同的,在控制台中,我可以看到它在崩溃之前找到了正确的路由。一个解释是,获取的路由已在上下文中删除(但该删除尚未保存到存储中)。我从来没有发现什么错误,但是我重写了我程序的那部分(用看起来基本相同的代码),然后它工作得很好。
CoreData: annotation: total fetch execution time: 0.0026s for 1 rows.
0 routes