CoreData 测试实体是不是为空

Posted

技术标签:

【中文标题】CoreData 测试实体是不是为空【英文标题】:CoreData test if entity is nullCoreData 测试实体是否为空 【发布时间】:2017-02-25 14:30:43 【问题描述】:

我需要在我的 CoreData 数据库中找到一条记录,所以我做了这个函数。我的问题是,如果我没有找到任何记录,我想返回空值或任何我能捕捉到的东西......我该怎么做?

目前,当函数没有找到时,返回的是一个空对象(Vendeurs),但是当我测试这个空实体的属性时我的应用程序崩溃了

func recherche(code: String) -> Vendeurs 

   let v:Vendeurs = Vendeurs()

   let context=getContext(backGround: false)
   let fetchRequest:NSFetchRequest<Vendeurs> = Vendeurs.fetchRequest()
   let predicate:NSPredicate = NSPredicate(format: "code == %@", code)
   fetchRequest.predicate = predicate

   do 
      let result = try context.fetch(fetchRequest)
      if result.count > 0 
         return result[0]
      
    catch 

   
   return v

我的电话:

let v=Vendeur()
let ve=v.recherche(code: codeSecret)
if (Int(ve.id) > 0) && (Int(ve.id) != idVendeur) 
   // blah blah

感谢您的帮助...

奥利维尔

【问题讨论】:

【参考方案1】:

您无法捕获不会引发错误的内容。您需要改进工作流程。

在调用之后返回数组并检查空数组:

func recherche(code: String) -> [Vendeurs] 

   let context=getContext(backGround: false)
   let fetchRequest:NSFetchRequest<Vendeurs> = Vendeurs.fetchRequest()
   let predicate:NSPredicate = NSPredicate(format: "code == %@", code)
   fetchRequest.predicate = predicate

   do 
      return try context.fetch(fetchRequest)

    catch 
     print(error)
     return [Vendeurs]()
   


let vendeurs = v.recherche(code: codeSecret)
if !vendeurs.isEmpty, let vid = Int(vendeurs[0].id) 
    if vid > 0 && vid != idVendeur 
      // blah blah
    

或者使recherche方法can throw

func recherche(code: String) -> [Vendeurs] throws 

   let context=getContext(backGround: false)
   let fetchRequest:NSFetchRequest<Vendeurs> = Vendeurs.fetchRequest()
   let predicate:NSPredicate = NSPredicate(format: "code == %@", code)
   fetchRequest.predicate = predicate
   return try context.fetch(fetchRequest)


do  
   let vendeurs = try v.recherche(code: codeSecret)
   if !vendeurs.isEmpty, let vid = Int(vendeurs[0].id) 
       if vid > 0 && vid != idVendeur 
         // blah blah
       
   
 catch 
  print(error)

或者——第三个选项——如果recherche应该只检查并返回一个id > 0

func recherche(code: String) -> Int 

    let context=getContext(backGround: false)
    let fetchRequest:NSFetchRequest<Vendeurs> = Vendeurs.fetchRequest()
    let predicate:NSPredicate = NSPredicate(format: "code == %@", code)
    fetchRequest.predicate = predicate
    do 
        let result = try context.fetch(fetchRequest)
        guard !result.isEmpty, let id = Int(result[0].id) else  return 0 
        return id
     catch 
        print(error)
        return 0
    


let vid = v.recherche(code: codeSecret)
    if vid > 0 && vid != idVendeur 
      // blah blah
    

【讨论】:

以上是关于CoreData 测试实体是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

如何检查CoreData是不是为空?

与此上下文的 CoreData SwiftUI 错误不同的 NSManagedObjectModel

数据插入上的核心数据级联

核心数据可转换属性(NSArray)为空

在 CoreData 中获取实体时,实体关系是不是也会加载到内存中?

Restkit 是不是通过 CoreData Sqlite 处理实体唯一性?