【问题标题】:How do I check if core data class is nil. in SWIFT如何检查核心数据类是否为零。在 SWIFT 中
【发布时间】:2015-01-27 22:22:28
【问题描述】:

我创建了一个名为Status 的实体,其属性名为statusUpdate。我希望用户能够第一次创建一个状态,然后将其保存在核心数据中,然后在下次更新状态时保存核心数据中的旧状态。这是我所做的:

let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context: NSManagedObjectContext = appDel.managedObjectContext!
let newUser = NSEntityDescription.insertNewObjectForEntityForName("Status", inManagedObjectContext: context) as NSManagedObject

var request = NSFetchRequest(entityName: "Status")
request.returnsObjectsAsFaults = false
var results = context.executeFetchRequest(request, error: &self.error)

if results?.count > 0 {
    for result: AnyObject in results! {
        if var oldStatus = result.valueForKey("statusUpdate") as? String {
            println("Current User fetched status from Core Data")
            var newStatus = self.updateStatusText.text
            result.setValue(newStatus, forKey: "statusUpdate")
        } else if result.valueForKey("statusUpdate") == nil {
            var newStatus = self.updateStatusText.text
            newUser.setValue(newStatus, forKey: "statusUpdate")
            println("Status uploaded for the first time")
        }
    }
}

context.save(&self.error)

问题是else if 似乎总是在运行。我希望它基本上只运行 Status 实体为 nil (所以它只会在有人第一次更新状态时运行),然后当状态更新后,它将运行常规的 if 语句。

我不确定我做错了什么???

提前致谢。

【问题讨论】:

  • 为什么不明确检查 if (var oldStatus = result.valueForKey("statusUpdate") as?String) == nil

标签: ios xcode swift if-statement core-data


【解决方案1】:

代码的第 3 行插入了一个新的 Status 对象,因此每次执行此代码时,您都会添加一个额外的对象。新插入的对象的statusUpdate 为零(很可能)。

当您执行 fetch 时,在第 6 行,这个新的 Status 对象将与您之前保存的任何对象一起包含在 results 中。因此,当您遍历所有results 时,总会有一个statusUpdate 为nil。

我会重组您的代码以首先进行提取,确定是否有任何结果。如果是这样,请更新statusUpdate;如果没有,创建新对象并设置statusUpdate 字段。像这样的:

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

var request = NSFetchRequest(entityName: "Status")
request.returnsObjectsAsFaults = false
var results = context.executeFetchRequest(request, error: &self.error)

if let resultsArray = results { // explicitly test for nil results
    if resultsArray.count > 0 {
        // count should be at most one, but just in case we will iterate through:
        for result: AnyObject in resultsArray {
            println("Current User fetched status from Core Data")
            var newStatus = self.updateStatusText.text
            result.setValue(newStatus, forKey: "statusUpdate")
        }
    else { // resultsArray is empty, so insert a new object
        var newStatus = self.updateStatusText.text
        let newUser = NSEntityDescription.insertNewObjectForEntityForName("Status", inManagedObjectContext: context) as NSManagedObject
        newUser.setValue(newStatus, forKey: "statusUpdate")
        println("Status uploaded for the first time")
    }
} else { // fetch returned nil, so log an error:
    println("Nil returned by fetch")
}    
context.save(&self.error)

【讨论】:

    【解决方案2】:
       if (var oldStatus = result.valueForKey("statusUpdate") as? String) != nil{
    
            println("Current User fetched status from Core Data")
            var newStatus = self.updateStatusText.text
            result.setValue(newStatus, forKey: "statusUpdate")
    
    
        }else {
    
            var newStatus = self.updateStatusText.text
            newUser.setValue(newStatus, forKey: "statusUpdate")
            println("Status uploaded for the first time")
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多