如何使用 core-data 存储一个值? (迅速 2)

Posted

技术标签:

【中文标题】如何使用 core-data 存储一个值? (迅速 2)【英文标题】:How to store one value using core-data ? (swift 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

            

【问题讨论】:

【参考方案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 的缺点。

以上是关于如何使用 core-data 存储一个值? (迅速 2)的主要内容,如果未能解决你的问题,请参考以下文章

在同一个数据库上同时使用 core-data 和基于 sqlite c 的 api

Core-Data:想要将新的 web xml 内容持久保存到我的数据存储中,而不是替换现有的

iPhone 上 Core-Data 中的字符串被截断

IOS/objective-c/core-data:如何从相关实体获取属性

如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?

如何在 Mac 和 iPhone 之间同步 Core-Data 应用程序?