Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 核心数据获取返回空数组,但调试显示返回SQLite行?_Swift_Xcode_Sqlite_Core Data - Fatal编程技术网

Swift 核心数据获取返回空数组,但调试显示返回SQLite行?

Swift 核心数据获取返回空数组,但调试显示返回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

我在核心数据中的路线和行程之间有一对多的关系(每次行程必须遵循一条路线,但同一条路线上可能有许多行程)。有40条路线和几千次行程

此时,已经插入了路由并保存了上下文,现在我尝试根据id获取路由,以便将它们链接到trips

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