2016-06-20 217 views
2

概述保存在核心数据

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

我想知道

我最终需要的是所有这些TextField的保存到CoreData,这样我可以取回这些数据的能力是什么。我很感激提前的帮助。谢谢!

注意

我在内的整个(或大部分)的ViewController.swift文件,以便你可以看到我是如何声明的东西,然后它们是如何被调用。有问题的代码位于代码块底部的saveButton动作中。

CODE

@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)”。

回答

0

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

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

+0

谢谢!同样,这里有很大的noob,但是对象子类究竟是什么? – gavsta707

+0

当您使用核心数据模型时,Xcode的编辑器菜单有一个“Create NSManagedObject Subclass ...”选项。它可以让你创建符合你的设计的特定类,而不是总是处理泛型的'NSManagedObject'类型。 –

+0

谢谢!我会研究这个 – gavsta707

0

我会告诉你如何从字符串中获取int。因此使用它:

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

您可以将文本字段分配给ASTRING并将其转换为Int像我向您展示。

+0

谢谢!现在我到了一半!我很欣赏对noob问题的快速响应。 – gavsta707

+0

检查我编辑的答案,直接将textField的文本分配给一个变量并将其用于转换为Int。快乐的编码! :) – Dershowitz123

0

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

例如:

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

有效的字符集是0到9

和验证min和max(如果适用)。

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

我想这解决了你的问题。