识别coreData属性的类型

时间:2016-04-10 14:33:01

标签: ios swift core-data swift2

我正在编写一个库,允许开发人员在coreData上应用SQL代码,如下所示:

let manager = coreSQL()
manager.prepare("INSERT INTO Entity (name, age) VALUES (?,?)")
manager.execute(["Chuck Norris" , "76"])

要在coreData中插入我使用此

let context:NSManagedObjectContext = appDel.managedObjectContext
let newRow = NSEntityDescription.insertNewObjectForEntityForName(tableName, inManagedObjectContext: context)
if (columnsArray.count == values.count){
    for i in 0 ..< columnsArray.count{
        newRow.setValue(values[i], forKey: columnsArray[i])
    }
    do {try context.save()} catch _ {}
}
  • columnsArray = [&#34; name&#34;,&#34; age&#34;]

  • values = [&#34; Chuck Norris&#34; ,&#34; 76&#34;]

问题是在我的coreData对象中,age属性是Integer类型,你可能会注意到Chuck Norris的年龄是String,所以当我尝试执行我的应用程序时出现错误:

由于未捕获的异常终止应用&#39; NSInvalidArgumentException&#39;,原因:&#39;属性的值不可接受的类型:property =&#34; age&#34 ;;所需类型= NSNumber;给定type = _TtCs19_NSContiguousString;值= 76。&#39;

问题是:如何识别属性类型以将值转换为相同类型

1 个答案:

答案 0 :(得分:2)

您可以通过询问实体来识别属性类型:

let context:NSManagedObjectContext = appDel.managedObjectContext
let newRow = NSEntityDescription.insertNewObjectForEntityForName(tableName, inManagedObjectContext: context)
let attributes = newRow.entity().attributesByName()
if (columnsArray.count == values.count){
    for i in 0 ..< columnsArray.count{
        let attributeDescription = newRow.entity.attributesByName[columnsArray[1]]
        switch attributeDescription.attributeType {
        case StringAttributeType:
        }
        newRow.setValue(values[i], forKey: columnsArray[i])
    }
    try! context.save()
}