2016-10-22 30 views
8

任何帮助表示赞赏。Swift 3 - NSFetchRequest不同的结果

Xcode的自动更新,以8 ...我瞄准IOS 9.3

让所有跨转换的代码,但有一件事现在已经打破,我曾尝试过各种建议,类似的问题!我的提取请求,以前的工作现在正在打破。

我的目标是获得一个清晰的列表。

let results = try context.fetch(fetchRequest) 

随着控制台,所述的错误:在该行上的应用程序崩溃

Could not cast value of type 'NSKnownKeysDictionary1' (0x10fd29328) to 'MyApp.BodyType' (0x10eebc820). 

下面是函数

func getBodyTypes() { 
      let context = ad.managedObjectContext 
      let fetchRequest = NSFetchRequest<BodyType>(entityName: "BodyType") 
      fetchRequest.propertiesToFetch = ["name"] 
      fetchRequest.returnsDistinctResults = true 
      fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

      do { 
       let results = try context.fetch(fetchRequest) 

       for r in results { 
        bodyTypes.append(r.value(forKey: "name") as! String) 
       } 
      } catch let err as NSError { 
       print(err.debugDescription) 
      } 
} 

如果下面的线被隐藏它不”吨休息,但后来我没有得到我想要的!

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

我明白我可以使用所有的结果(4300)和循环通过他们的绷带固定的,但是这并不觉得解决这个问题的正确方法,尤其是因为它之前的工作!

+0

同样的问题。你解决了吗? –

+0

同样在这里:/任何新闻?我也通过遍历非明显的结果并忽略重复来临时解决它。 – datayeah

+0

同样的问题......我将要做的是@datayeah暂时正在做的事情,但除此之外无法从SQL方面找到任何解决方案。 –

回答

7

诀窍就是让通用更一般的 - 而不是在你的读取请求<BodyType>,使用<NSFetchRequestResult>

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BodyType") 

,读取请求的结果是[Any],所以你需要转换到相应的使用前的字典类型。例如:

func getBodyTypes() { 
    let context = ad.managedObjectContext 
    // 1) use the more general type, NSFetchRequestResult, here: 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BodyType") 
    fetchRequest.propertiesToFetch = ["name"] 
    fetchRequest.returnsDistinctResults = true 
    fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

    do { 
     let results = try context.fetch(fetchRequest) 

     // 2) cast the results to the expected dictionary type: 
     let resultsDict = results as! [[String: String]] 

     for r in resultsDict { 
      bodyTypes.append(r["name"]) 
     } 

    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
} 

注:NSFetchRequestResult是一个协议,由四种类型通过:
- NSDictionary
- NSManagedObject
- NSManagedObjectID,并
- NSNumber

通常情况下,我们使用它与NSManagedObject,如您的BodyType。在这种情况下,虽然,你得到的字典类型,因为声明:

fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 
+0

保存了我的一天。谢谢:) – Ali

-1
 let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: 
    "BodyType") 
    fetchRequest.propertiesToFetch = ["name"] 
    fetchRequest.returnsDistinctResults = true 
    fetchRequest.resultType = NSFetchRequestResultType.dictionaryResultType 

    do { 
     let results = try context.fetch(fetchRequest) 

     for r in results { 
      let p = (r as AnyObject).value(forKey: "name") as! String 
      print(p) 
     } 


    } catch let err as NSError { 
     print(err.debugDescription) 
    } 
+1

请解释此代码。 – RamenChef