【问题标题】:How to store one value using core-data ? (swift 2)如何使用 core-data 存储一个值? (迅速 2)
【发布时间】:2016-01-26 00:17:01
【问题描述】:

我正在开发一个应用程序来使用核心数据一次存储一个电话号码,用户应该能够在 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{

            }

【问题讨论】:

    标签: ios swift core-data swift2


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

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

    希望这会有所帮助!

    【讨论】:

    • 出现了 2 个错误,第 5 行的第一个错误说“非 void 函数应该返回一个值”,第 15 行的第二个错误说“使用未解析的标识符 'setting'”
    • 我认为你没有正确实现代码......让我试着帮助你。在“守卫”内的回报中,你什么也不回报。如果该函数是一个 Void 函数 (function() {}),这只会让您脱离该方法。至于第二个错误,你是用“if setting”还是“if let setting”?
    • 我把代码放在textFieldShouldReturn方法里面,所以当用户按下键盘的返回按钮时,它会将第二个错误的数据插入到数据库中,我使用了“if let setting”跨度>
    • 返回应该有一个真或假值(取决于你希望返回按钮做什么)。至于另一个错误,我忘了在guard 上添加返回。我的错。查看编辑。
    • 很抱歉让您头疼,但我仍然面临第 15 行代码中的一个错误 guard let settingFetched = Setting.first else ,错误仍然显示“使用未解析的标识符设置”,我认为下面的这一行可以解决问题,对吧? let Setting = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [SettingData]
    【解决方案2】:

    对于您想要做的事情,Core Data 太过分了。

    请改用NSUserDefaults。轻松多了。

    【讨论】:

    • 我在iOS开发方面有点天真,所以我不明白NSUserDefaults如何解决我的问题。它可以帮助我做我想做的事吗?
    • 只查类参考,超级简单。
    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • @Abubakr 达尔。不,实际上这是解决 OP 问题的最佳方法。他想用大炮压扁一只苍蝇。我告诉他使用更有用的工具。打这个电话的专业知识是什么?
    • 您的答案的本质可能是正确的,但肯定还不够。也许如果你指出他为什么不应该使用 Coredata 而使用 NSUserDefaults。如果可能,您还应该提及 UserDefaults 的缺点。
    猜你喜欢
    • 2011-04-17
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    相关资源
    最近更新 更多