ios - 如何使用核心数据存储一个值? ( swift 2)

标签 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{

            }

最佳答案

这是我的解决方案

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 子类(我假设的设置),而不是仅仅使用 NSManagedObject 和键/值编码。

由于我使用的是文本编辑器,所以代码中可能存在一些小的语法错误。

希望这对您有所帮助!

关于ios - 如何使用核心数据存储一个值? ( swift 2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004931/

相关文章:

objective-c - 移除 UISearchBar 的内阴影

ios - Swift 3 以编程方式创建的按钮不可点击

swift - 转换字符串!到字符串

ios - 对多个实体进行核心数据过滤

cocoa - CoreData、SourceList 和 NSTreeController

ios - Unresolved 错误 Error Domain=NSCocoaErrorDomain Code=132001 "(null)"

ios - 使用 ShareExtension 分发 Flutter 应用程序时缺少 CFBundleShortVersionString

ios - 违反 Core Data 的线程合约EXC_BREAKPOINT(代码=1,子代码=0x1f0ad1c8c)

ios - 我可以在 App Store 中只提交 1 个视频预览吗?

swift - MutableCollection 与 RangeReplaceableCollection