Core data coreData只返回一个结果
有一个奇怪的问题,不管我应用哪个谓词,它只返回一个结果,如果我不添加任何谓词,它将返回表中的所有行,我想要的只是返回带有匹配progid的行 我有一个programid列表,基于此我想在TvInfo表中搜索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 = [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(“获取要显示的频道时出错”)
}
})
附言:
感谢您在谓词中的帮助尝试使用%@而不是%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")
}
})