在核心数据中保存一个整数

Posted

技术标签:

【中文标题】在核心数据中保存一个整数【英文标题】:Saving an integer in core data 【发布时间】:2016-06-20 13:18:11 【问题描述】:

概述

我需要将几个 TextFields 保存到 CoreData 中,但只有第一个(如下面的 pickerView 所示)可以正确保存和打印。其他的没有正确保存,例如,当我尝试保存整数时,我得到一个错误,说他们不能接受一个字符串,这是有道理的。我只是找不到解决整数字符串问题的方法。当我尝试将所有内容都转换为字符串时会发生另一个错误(主要是因为我不需要对其进行任何算术运算,所以没关系),它只是给了我在 saveButton 函数中的一个断点。

我想知道什么

我最终需要的是能够将所有这些 TextField 保存到 CoreData 中,以便我以后可以检索它们。我提前感谢您的帮助。谢谢!

注意

我包含了整个(或大部分) ViewController.swift 文件,以便您可以看到我是如何声明事物以及如何调用它们的。有问题的代码位于代码块底部的 saveButton 操作中。

代码

@IBOutlet weak var locationOfMachine: UITextField!
@IBOutlet weak var engineHours: UITextField!
@IBOutlet weak var YOM: UITextField!
@IBOutlet weak var serialNo: UITextField!
@IBOutlet weak var modelName: UITextField!
@IBOutlet weak var pickerTextField: UITextField!
var pickOption = ["Wirtgen","Kleeman","Hamm","Vögele"]
   override func viewDidLoad() 
    super.viewDidLoad()
    var pickerView = UIPickerView()
    pickerView.delegate = self


    pickerTextField.inputView = pickerView
    // Do any additional setup after loading the view, typically from a nib.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int 
    return 1





@IBAction func saveButton(sender: AnyObject)

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

    var entity1 = NSEntityDescription.insertNewObjectForEntityForName("UsedInfo", inManagedObjectContext:context) as NSManagedObject
    entity1.setValue(pickerTextField.text, forKey: "product")
    entity1.setValue(modelName.text, forKey:"modelName")
    entity1.setValue(serialNo.text, forKey:"serialNo")
    entity1.setValue(Int(YOM.text!), forKey:"yom")
    entity1.setValue(engineHours.text, forKey:"engineHours")
    entity1.setValue(locationOfMachine.text, forKey:"location")
    print(entity1.valueForKey("product"))
    print(entity1.valueForKey("modelName"))
    print(entity1.valueForKey("serialNo"))
    print(entity1.valueForKey("yom"))
    print(entity1.valueForKey("engineHours"))


    do 
        try context.save()
    
    catch 
        print("error")
    



编辑

在尝试将所有内容保存为字符串时,因为我只需要检索它,我遇到了这个问题:

    entity1.setValue(pickerTextField.text, forKey: "product")
    entity1.setValue(modelName.text, forKey:"modelName")
    entity1.setValue(serialNo.text, forKey:"serialNo") <-Thread1:Breakpoint1.1
    entity1.setValue(YOM.text, forKey:"yom")
    entity1.setValue(engineHours.text, forKey:"engineHours")
    entity1.setValue(locationOfMachine.text, forKey:"location")
    print(entity1.valueForKey("product"))
    print(entity1.valueForKey("modelName"))
    print(entity1.valueForKey("serialNo"))
    print(entity1.valueForKey("yom"))
    print(entity1.valueForKey("engineHours"))

我还在调试器窗口中得到“(lldb)”。

【问题讨论】:

【参考方案1】:

我将向您展示如何从字符串中获取 int。相应地使用它:

var aString = "0000" // var aString = textField.text!
var numFromString = Int(aString)

您可以将文本字段分配给 aString 并将其转换为 Int,就像我向您展示的那样。

【讨论】:

谢谢!现在我已经成功了一半!感谢您对菜鸟问题的快速回复。 检查我编辑的答案,直接将 textField 的文本分配给一个变量并使用它来转换为 Int。快乐编码! :)【参考方案2】:

对于不需要算术的东西,在 Core Data 中将它们定义为字符串。对于其他数字,它应该像 Int(YOM.text!) 一样工作。

但是,我建议您为“UsedInfo”创建一个托管对象子类,这样您就可以直接使用它的属性而不是使用setValue:forKey:。子类的好处是它会显式地向您显示数据类型。

【讨论】:

谢谢!同样,这里是大菜鸟,但对象子类到底是什么? 当您使用核心数据模型时,Xcode 的编辑器菜单有一个“创建 NSManagedObject 子类...”选项。它允许您创建与您的设计相匹配的特定类,而不是总是处理通用的NSManagedObject 类型。 谢谢!我会调查一下【参考方案3】:

在尝试存储之前验证所有文本字段,为每个文本字段设置适当的键盘并为每个文本字段提供有效的字符集。

例如:

YOM 文本字段:使用只有整数的键盘。

有效字符集为 0 到 9

如果适用,验证最小值和最大值。

如果任何验证条件失败,则抛出警报以输入有效数据。

我想这可以解决您的问题。

【讨论】:

以上是关于在核心数据中保存一个整数的主要内容,如果未能解决你的问题,请参考以下文章

在核心数据中选择整数类型

在线程中保存核心数据

在核心数据中保存 uipickerview 颜色

我应该如何对我的核心数据实体中的 NSNumber 属性执行计算/更新?

如何仅使用月份和日期从核心数据中获取

保存已编辑的核心数据实体未保存