Core data coreData只返回一个结果

Core data coreData只返回一个结果,core-data,swift4,nspredicate,nsfetchrequest,Core Data,Swift4,Nspredicate,Nsfetchrequest,有一个奇怪的问题,不管我应用哪个谓词,它只返回一个结果,如果我不添加任何谓词,它将返回表中的所有行,我想要的只是返回带有匹配progid的行 我有一个programid列表,基于此我想在TvInfo表中搜索 ....... ...... progId = [Int64(3211),Int64(16844)] // hardcored ids from tvInfo table let tvInfoRequest: NSFetchRequest<TvInfo> = TvInfo.fe

有一个奇怪的问题,不管我应用哪个谓词,它只返回一个结果,如果我不添加任何谓词,它将返回表中的所有行,我想要的只是返回带有匹配progid的行

我有一个programid列表,基于此我想在TvInfo表中搜索

.......
......
progId = [Int64(3211),Int64(16844)] // hardcored ids from tvInfo table 
let tvInfoRequest: NSFetchRequest<TvInfo> = TvInfo.fetchRequest()
        tvInfoRequest.predicate = NSPredicate(format: "progId == %i", argumentArray: progId)
        tvInfoRequest.returnsDistinctResults = true
        tvInfoRequest.resultType = .managedObjectResultType
        var tvShows = [TvInfo]()

        coreDataStack.managedObjectContext.performAndWait({
            do{
                let tvInfoResult = try self.coreDataStack.managedObjectContext.fetch(tvInfoRequest)
                tvShows = tvInfoResult
            } catch {
                fatalError("Error fetching channels displayShow")
            }
        })
奇怪的是,我使用了相同的逻辑从通道表中获取progId,它工作正常(使用精确匹配获取progId),并且它也适用于其他表,就像从通道表获取通道Id一样

// fetching progIds from channel table 
let tvScheduleRequest: NSFetchRequest<TvSchedule> = TvSchedule.fetchRequest()
        tvScheduleRequest.predicate = NSPredicate(format: "chId == %i", argumentArray: channelIds)
        tvScheduleRequest.returnsDistinctResults = true
        var progId = [Int64]()

        coreDataStack.managedObjectContext.performAndWait({
            do{
                let tvScheduleResult = try self.coreDataStack.managedObjectContext.fetch(tvScheduleRequest)
                if tvScheduleResult.count > 0 {
                    for array in tvScheduleResult {
                        progId.append(array.progId)
                    }
                }
            } catch {
                fatalError("Error fetching channels to display show")
            }
        })
//从通道表中获取progIds
让tvScheduleRequest:NSFetchRequest=TvSchedule.fetchRequest()
tvScheduleRequest.predicate=NSPredicate(格式:“chId==%i”,argumentArray:ChannelID)
tvScheduleRequest.returnsDistinctResults=true
变量progId=[Int64]()
coreDataStack.managedObjectContext.performAndWait({
做{
让tvScheduleResult=try self.coreDataStack.managedObjectContext.fetch(tvScheduleRequest)
如果tvScheduleResult.count>0{
对于tvScheduleResult中的数组{
progId.append(array.progId)
}
}
}抓住{
fatalError(“获取要显示的频道时出错”)
}
})
附言:

  • 它返回1行,所以它不是上下文问题,键错了, 线
  • 表中有数据,好像我没有应用任何谓词 返回100多行
  • 我使用argumentArray作为谓词,而不是单个参数CVarArg

  • 感谢您在谓词中的帮助

    尝试使用%@而不是%i

    tvInfoRequest.predicate=NSPredicate(格式:“progId==%i”,argumentArray:progId)


    还有一件事要检查传递给predicate progId的变量。

    我认为您没有理解一些事情:您需要
    someProperty==something
    ,但是当您想要
    someProperty==thatary
    中的一个项时,它是一个包含各种值的数组。您想在中使用
    :或者更高:也可以尝试一次:NSPredicate(格式:“connectionType IN%@”,YourInArray)
    
    // fetching progIds from channel table 
    let tvScheduleRequest: NSFetchRequest<TvSchedule> = TvSchedule.fetchRequest()
            tvScheduleRequest.predicate = NSPredicate(format: "chId == %i", argumentArray: channelIds)
            tvScheduleRequest.returnsDistinctResults = true
            var progId = [Int64]()
    
            coreDataStack.managedObjectContext.performAndWait({
                do{
                    let tvScheduleResult = try self.coreDataStack.managedObjectContext.fetch(tvScheduleRequest)
                    if tvScheduleResult.count > 0 {
                        for array in tvScheduleResult {
                            progId.append(array.progId)
                        }
                    }
                } catch {
                    fatalError("Error fetching channels to display show")
                }
            })