如何检查核心数据是否为空

时间:2015-04-21 10:38:22

标签: swift core-data

如何使用swift检查核心数据是否为空。我试过这个方法:

var people = [NSManagedObject]()

if people == nil {

}

但这会导致此错误

  

“二元运算符'=='不能应用于[NSManagedObject]类型的操作数和nil”

4 个答案:

答案 0 :(得分:9)

Swift 3解决方案:

var isEmpty : Bool {
    do{
        let request = NSFetchRequest(entityName: YOUR_ENTITY)
        let count  = try context.count(for: request)
        return count == 0 ? true : false
    }catch{
        return true
    }
}

答案 1 :(得分:4)

要检查核心数据库是否为空,您必须在要检查的实体上设置NSFetchRequest,并检查请求的结果是否为空。

您可以使用此功能进行检查:

func entityIsEmpty(entity: String) -> Bool
{

    var appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    var context = NSManagedObjectContext()

    var request = NSFetchRequest(entityName: entity)
    var error = NSErrorPointer()

    var results:NSArray? = self.context.executeFetchRequest(request, error: error)

    if let res = results
    {
        if res.count == 0
        {
            return true
        }
        else
        {
            return false
        }
    }
    else
    {
        println("Error: \(error.debugDescription)")
        return true
    }

}

或更简单,更短的解决方案:(使用.countForFetchRequest

func entityIsEmpty(entity: String) -> Bool
{

    var appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    var context = NSManagedObjectContext()

    var request = NSFetchRequest(entityName: entity)
    var error = NSErrorPointer()

    var results:NSArray? = self.context.executeFetchRequest(request, error: error)

    var count = context.countForFetchRequest(request, error: error)

    if error != nil
    {
        println("Error: \(error.debugDescription)")
        return true
    }
    else
    {
        if count == 0
        {
            return true
        }
        else
        {
            return false
        }

    }


}

答案 2 :(得分:4)

根据Dejan Skledar的回答,我摆脱了一些编译器警告并将其应用于Swift 2.0。

func entityIsEmpty(entity: String) -> Bool
{

    let context = NSManagedObjectContext()
    let request = NSFetchRequest(entityName: entity)
    var results : NSArray?

    do {
        results = try context.executeFetchRequest(request) as! [NSManagedObject]

        return results.count == 0

    } catch let error as NSError {
        // failure
        print("Error: \(error.debugDescription)")
        return true
    }
}

但是,我不确定是否需要if let res=results子句及其else子句。

答案 3 :(得分:1)

SwiftUI解决方案

struct ContentView: View {
   @Environment(\.managedObjectContext) private var viewContext

   @FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \MyObject.created, ascending: true)],
    animation: .default)
   private var myobjects: FetchedResults<MyObject>

   var body: some View {
    if self.myobjects.isEmpty{
        Text("There are no objects in the current database.")
    }
    else{
        // whatever
    }
   }
}