Swift:无法将类型 'NSManagedObject_' 的值转换为 'dataModel.Entity'

标签 swift uitableview core-data casting nsfetchedresultscontroller

我真的不知道我要解释什么,如果需要的话,请不要犹豫,问我更多的代码或解释.. 我正在尝试使用 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 的委托(delegate)设置为 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 中提取的字符串填充我的 nTask,我保存上下文并重新加载数据库:

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 , 我们必须声明 cellForRowAtIndexPathnumberOfRowsInSection ,这些是:

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) as! Task在我的 cellForRowAtIndexPath 上。

完整的错误是:Could not cast value of type 'NSManagedObject_Task_' (0x79ebd190) to 'TaskManager.Task' (0xa1f08).

我找了半天多没有结果。我真的不明白发生在我身上的事......

我很抱歉提供了这么多代码,但我不知道我在哪里或为什么会出现此错误,所以我必须提供尽可能多的信息.​​.

非常感谢您阅读到最后,感谢您的帮助。

问候。

编辑:

我通过做几件事终于解决了我的问题。我真的不知道哪一个解决了...我添加了注释 @objc(Task)在我的任务类上,在我的数据模型上,我将类更改为任务,检查我的 NSManagedObjectModel 是 let modelURL = NSBundle.mainBundle().URLForResource("TaskManager", withExtension: "momd")!和网址 let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("TaskManager.sqlite")在 AppDelegate 上..

感谢您的帮助。

最佳答案

我遇到了类似的问题,在我的例子中,有效的方法是将这个 @objc(NameOfClass) 添加到我的核心数据类定义之上。谢谢!

关于Swift:无法将类型 'NSManagedObject_' 的值转换为 'dataModel.Entity',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30805700/

相关文章:

ios - 在类外单击按钮时将 tableView 添加为 subview

objective-c - Core Data迁移后如何保持数据排序?

ios - 当核心数据中的子关系实体发生变化时通知父实体

swift - 在 Swift 包中包含 Playgrounds 的正确方法是什么?

xcode - 带有第三个 View 的选项卡 View ?

ios - 选择时导航栏中的 UIBarButtonItem 会突出显示,但工具栏中的 UIBarButtonItem 不会

ios - 如何将 TableView Controller 添加到现有 Storyboard View Controller ?

ios - Swift:为什么添加图像 subview 需要这么长时间?

swift - 我如何在 Swift 中初始化这种包含属性但没有构造函数的枚举?

objective-c - NSPrivateQueueConcurrencyType上下文只能在performBlock内操作?