如何使用核心数据存储一个值? (迅速2)

时间:2016-01-26 00:17:01

标签: ios swift core-data swift2

我正在开发一个使用核心数据存储一个电话号码的应用程序,用户应该可以在ui文本字段中输入新的电话号码,如果它等于nil,它应该存储一个新的电话号码,否则它应该用新号码替换旧号码;它应该只存储一个值。

但代码不能正常工作

我的代码有什么问题?

  let moContext: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let context: NSManagedObjectContext = moContext.managedObjectContext
            let phoneNu = NSEntityDescription.insertNewObjectForEntityForName("Setting", inManagedObjectContext: context)


            let fetchRequest = NSFetchRequest(entityName: "Setting")
            fetchRequest.predicate = NSPredicate(format: "phoneNumber = %@", phoneNumber)
           // phoneNu.setValue(phoneNumber.text, forKey: "phoneNumber")



            do{
                let request = NSFetchRequest(entityName: "Setting")
                let phoneN = try context.executeFetchRequest(request)
                if phoneN.count == 0{
                    phoneNu.setValue(phoneNumber.text, forKey: "phoneNumber")
                }else if phoneN.count != 0{
                  for item in phoneN as! [NSManagedObject]{

                    let number = item.valueForKey("phoneNumber")
                    number?[0]?.setValue(phoneNumber.text, forKey: "phoneNumber")
                    }
                }
            }catch{

                print("error")

            }


            do{

                let request = NSFetchRequest(entityName: "Setting")
                let phoneNumber = try context.executeFetchRequest(request)

                if phoneNumber.count > 0{
                    for item in phoneNumber as! [NSManagedObject]{

                        let number = item.valueForKey("phoneNumber")

                        print(number!)
                    }
                }


            }catch{

            }

2 个答案:

答案 0 :(得分:1)

对于你想要做的事情,核心数据是过度的。

请改用NSUserDefaults。这么容易。

答案 1 :(得分:1)

这是我的解决方案

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

guard let phoneNumber = phoneNumber.text where phoneNumber.characters.count > 0 else {
    return// returns if textField is empty.
}

let fetchRequest = NSFetchRequest(entityName: "Setting")
fetchRequest.predicate = NSPredicate(format: "phoneNumber = %@", phoneNumber)

do{
   let request = NSFetchRequest(entityName: "Setting")
   let phoneObjectArray = try context.executeFetchRequest(request)

   guard let settingFetched = phoneObjectArray as? [Setting] where settingFetched.count > 0 else {
    // if enters here -> 0 phone numbers were found

       if let setting = NSEntityDescription.insertNewObjectForEntityForName("Setting", inManagedObjectContext: context) as? Setting {
        setting.phoneNumber = phoneNumber

        // call context.save()
       }

    return // this I forgot
   }

let settingObject = settingFetched.first

// fetch results return store phone number.
// update phone number
settingObject.phoneNumber = phoneNumber
// call context.save()

} catch let error as NSError! {
  print("error: \(error)")

}

你需要调用" save()"保持信息的功能。

我对名称变量进行了一些更改,添加了一些验证并根据您的代码假设了一些模型类名。 我总是建议使用NSManagedObject子类(设置I假设),而不是仅使用NSManagedObject和键/值编码。

代码上可能存在一些轻微的语法错误,因为我使用的是文本编辑器。

希望这有帮助!