Swift:无法将’NSManagedObject_’类型的值转换为’dataModel.E
我真的不知道我要解释与否,如果需要,请不要犹豫,问我更多的代码或解释.
我正在尝试使用CoreData来存储从http POST请求获取的数据,然后在UITableView上打印它们. 我成功地从JSON获取数据并将它们发送到数据库.问题是当我尝试将数据从数据库发送到UITableView时. 这是我第一次使用Core Data,所以为了理解它是如何工作的,我已经按照本教程改编了我的情况:https://www.youtube.com/watch?v=UniafUWsvLg 这是我正在工作的实体: import Foundation import CoreData class Task: NSManagedObject { @NSManaged var summary: String @NSManaged var status: String @NSManaged var responsable: String @NSManaged var id: String @NSManaged var detail: String @NSManaged var date: String @NSManaged var context: String } 这是准备CoreData工作的代码的一部分,我对它有一些评论: //Preparing variables used to get and send datas from DB let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext var nTask: Task? = nil var frc : NSFetchedResultsController = NSFetchedResultsController() func getFetchedResultsController() -> NSFetchedResultsController{ frc = NSFetchedResultsController(fetchRequest: taskFetchRequest(),managedObjectContext: context!,sectionNameKeyPath: nil,cacheName: nil) return frc } func taskFetchRequest() -> NSFetchRequest { //On which Entity are we working? let fetchRequest = NSFetchRequest(entityName: "Task") //Which attribute get the Order by. There summary as Ascending let sortDescriptor = NSSortDescriptor(key: "summary",ascending: true) fetchRequest.sortDescriptors = [sortDescriptor] return fetchRequest } 现在我已经声明了这一点,我在viewDidLoad上设置了getFetchedResultsController的委托给self: override func viewDidLoad() { super.viewDidLoad() frc = getFetchedResultsController() frc.delegate = self frc.performFetch(nil) } 这是我创建数据库链接以从中获取数据的方法: //Link creation to SQLite DB let context = self.context let ent = NSEntityDescription.entityForName("Task",inManagedObjectContext: context!) let nTask = Task(entity: ent!,insertIntoManagedObjectContext: context) 然后我用从JSON中提取的String填充我的nTask,我保存上下文并重新加载DataBase: for dict in json2 { var apps = [String]() if let summary = dict["summary"] as? String{ nTask.summary = summary } if let description = dict["description"] as? String{ nTask.detail = description } if let context = dict["context"] as? String{ nTask.context = context } if let due = dict["due"] as? String { nTask.date = due } if let status = dict["status"] as? String{ nTask.status = status } if let responsible = dict["responsible"] as? String{ nTask.responsable = responsible } if let id = dict["id"] as? String{ nTask.id = id } } context?.save(nil) println(nTask) self.tableView.reloadData() 当我们使用TableView时,我们必须声明cellForRowAtIndexPath和numberOfRowsInSection,它们是: func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell: UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("customTableViewCell") as! UITableViewCell let task = frc.objectAtIndexPath(indexPath) as! Task cell.textLabel?.text = task.summary var detail = task.detail var context = task.context var due = task.date var status = task.status var responsible = task.responsable cell.detailTextLabel?.text = "Contexte: (context),Detail: (detail),Status: (status),Ending date: (due)" return cell } func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int { let numberOfRowsInSection = frc.sections?[section].numberOfObjects return numberOfRowsInSection! } 错误是行let task = frc.objectAtIndexPath(indexPath)为!我的cellForRowAtIndexPath上的任务. 完整的错误是:无法将’NSManagedObject_Task_'(0x79ebd190)类型的值转换为’TaskManager.Task'(0xa1f08). 我搜索了半天以上没有结果.我真的不明白发生在我身上的事情…… 我很遗憾给出了这么多代码,但我不知道我在哪里或为什么会有这个错误,所以我必须尽可能地提供信息. 非常感谢您阅读到最后,感谢您的帮助. 问候. 编辑: 我通过做几件事终于解决了我的问题.我真的不知道哪一个解决了…我在我的Task类上添加了注释@objc(Task),在我的DataModel上我将类更改为Task,检查了我的NSManagedObjectModel是let modelURL = NSBundle.mainBundle().URLForResource (“TaskManager”,withExtension:“momd”)! AppDelegate上的url let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(“TaskManager.sqlite”).. 谢谢您的帮助. 解决方法
尝试:
let task = frc.objectAtIndexPath(indexPath) as NSManagedObject 也许你遇到的真正问题不是它的“cellForRowAtIndexPath”中的提取是在它的“FOR”中: for dict in json2 { ... if let summary = json2["summary"] as? String{ nTask.summary = summary } ... 当你从“json2”得到它时,它正在寻找“dict”的“摘要” (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |