Swift 4(Xcode 9)Core Data读取失败:read方法谓词异常问题
帮你搞定read方法的谓词问题!
嘿,看你遇到的问题——read方法传0能读全量数据,传其他值就不行,结合你给的代码片段,我帮你捋捋可能的问题和解决办法:
首先先指出一个明显的小错误:你写的let ReadData = DataClass()这行是有问题的!因为你的DataClass只提供了带三个参数的初始化器,没有默认初始化方法,这行代码根本编译不过,估计是你粘贴的时候没写完,应该是从数据存储(比如Core Data)查询后再初始化实例对吧?
最可能的问题:谓词逻辑写反或者处理不当
通常这种“传0正常,传其他值失效”的情况,都是谓词的条件判断逻辑出了问题,常见的两种错误:
- 逻辑分支搞反:比如你可能写成了“当no等于0时添加匹配条件,其他时候不添加”,这就刚好和你要的效果相反了。
- 可选值匹配错误:你的
DataClass里no是Int16?可选类型,如果存储的数据源里no也是可选的,直接用== %d去匹配非可选的参数,会因为nil值或者类型不匹配导致匹配失败。
给你写个正确的示例代码
假设你是从Core Data里查询数据,正确的read方法应该是这样的:
func read(no: Int16) -> DataClass? { // 假设你的数据实体是DataEntity,替换成你实际的实体名 let fetchRequest: NSFetchRequest<DataEntity> = DataEntity.fetchRequest() // 核心逻辑:no为0时不设置谓词(查全部),否则匹配对应no if no != 0 { // 如果数据源里的no是可选类型,要用%@占位符,传入NSNumber fetchRequest.predicate = NSPredicate(format: "no == %@", NSNumber(value: no)) // 如果数据源里的no是非可选的Int16,用%d也可以:"no == %d", no } do { // 假设你有Core Data的context实例,替换成你实际的上下文 guard let entity = try context.fetch(fetchRequest).first else { print("没有找到对应的数据") return nil } // 把查询到的实体转成DataClass实例 return DataClass(no: entity.no, title: entity.title ?? "", content: entity.content ?? NSAttributedString(string: "")) } catch { print("读取数据出错:\(error.localizedDescription)") return nil } }
几个关键的注意点
- 明确分支逻辑:一定要保证
no=0时不添加任何谓词条件,这样查询的就是全部数据;非0值时才添加匹配对应no的条件,别搞反了。 - 处理可选值:如果你的数据源(比如Core Data实体)里的
no字段是可选类型,千万记得用%@作为占位符,把Int16转成NSNumber传入,不然会匹配不到数据。 - 检查初始化逻辑:别再直接调用
DataClass()了,你的类没有默认初始化方法,必须用带三个参数的初始化器来创建实例。
内容的提问来源于stack exchange,提问作者Sidney Liu
相关产品推荐
相关产品推荐

