NSPredicate 未在 CoreData 中返回 Int32

Posted

技术标签:

【中文标题】NSPredicate 未在 CoreData 中返回 Int32【英文标题】:NSPredicate Not Returning Int32 in CoreData 【发布时间】:2018-08-02 08:50:19 【问题描述】:

Int32 的谓词不起作用。

我在核心数据中有一个实体,它为它的一个属性保存 Int32(见下文)。

我已经通过 fetch 验证了 Core Data 中存储了数据:

我想扫描核心数据实体并检查条目,使用 Int32 的 Predicate:

extension serialPortIO 

// ************************************************
// MARK: - Core Data - Search for Object using uuid
// ************************************************
func entityExists(moc: NSManagedObjectContext, ioKitDevice: UInt32) -> Bool 

    var result: Bool = false

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "SerialPortENT")
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "ioKitDevice", ascending: true)]
    //fetchRequest.predicate = NSPredicate(format: "ioKitDevice = %i", Int32(ioKitDevice))


    do let fetchResults = try moc.fetch(fetchRequest) as! [SerialPortENT]
        if fetchResults.count == 0  result = false  else  result = true 
     catch 
        messageClass().aLog(message: "[\(ioKitDevice) :: Record search error]", .Error)
            
    return result

每当我运行时,结果总是错误的。

【问题讨论】:

试试fetchRequest.predicate = NSPredicate(format: "ioKitDevice = %@", NSNumber(value: ioKitDevice) 嗨,这也可以:fetchRequest.predicate = NSPredicate(format: "ioKitDevice = %i", ioKitDevice) 【参考方案1】:

在 CoreData (Swift 4) 中使用 Int32 的 NSPredicate 的工作代码

// Create Entity Description
let entityDescription = NSEntityDescription.entity(forEntityName: "Photos", in: appDelegate.managedObjectContext)

print(ISRecordThere(Entity: Entity, ID: 5)) // True or False

这里是获取数据功能

func ISRecordThere(Entity :NSEntityDescription,ID:Int?) -> Bool

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
    fetchRequest.predicate = NSPredicate(format: "id == %i", ID!)

    // Configure Fetch Request
    fetchRequest.entity = Entity

    do

        let Fetchedresult = try appDelegate.managedObjectContext.fetch(fetchRequest)

        if  Fetchedresult.count > 0
        
            let result:NSManagedObject = Fetchedresult[0] as! NSManagedObject

            if result.value(forKey: "id") as? Int != ID
            
                return false
            
            else
            
                return true
            
        
        else
        
            return false
        
    
    catch
    
        let fetchError = error as NSError
        print(fetchError)
    
    return false

【讨论】:

以上是关于NSPredicate 未在 CoreData 中返回 Int32的主要内容,如果未能解决你的问题,请参考以下文章

CoreData:基于关系的 NSPredicate

如何使用 NSPredicate 从 CoreData 中删除选定数量的行?

NSPredicate:“添加”一对多关系CoreData中所有实体的属性值

CoreData NSPredicate

在 Swift 中使用 NSPredicate 对 CoreData 结果进行排序

在 Swift 中使用 NSPredicate 显示 CoreData 的结果