iOS:Swift:核心数据:错误:+entityForName:nil 不是搜索实体名称的合法 NSManagedObjectContext 参数

Posted

技术标签:

【中文标题】iOS:Swift:核心数据:错误:+entityForName:nil 不是搜索实体名称的合法 NSManagedObjectContext 参数【英文标题】:iOS: Swift: Core Data: Error: +entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 【发布时间】:2014-08-23 11:54:39 【问题描述】:

我将 Core Data 用于 Swift 语言的表格视图。可以启动成功,但是在AddView中点击Done按钮后,出现错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+entityForName:nil 不是搜索实体名称“OneItemCD”的合法 NSManagedObjectContext 参数”

我不知道为什么。有人可以帮我弄清楚吗?非常感谢!

这里是代码。有一个添加栏按钮项。单击此按钮转移到 AddViewController。在文本视图中输入内容并单击完成按钮后,转移回 TableViewController。

TableViewController:

import UIKit
import CoreData

class TableViewController: UITableViewController, NSFetchedResultsControllerDelegate 

var managedObjectContext: NSManagedObjectContext? = nil

override func viewDidLoad() 
    super.viewDidLoad()


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView!) -> Int 

    return 1


override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int 

    return 0


@IBAction func unwindToList(segue: UIStoryboardSegue) 

    var source: AddViewController = segue.sourceViewController as AddViewController
    source.managedObjectContext = self.managedObjectContext
    var noteContent: String? = source.contentBody.text

    if noteContent != nil 

        let context = self.fetchedResultsController.managedObjectContext
        let entity = self.fetchedResultsController.fetchRequest.entity
        let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name, inManagedObjectContext: context) as NSManagedObject

        newManagedObject.setValue(noteContent, forKey: "content")

        var error: NSError? = nil
        if !context.save(&error) 

            abort()
        
        self.tableView.reloadData()
    





// MARK: - Fetched results controller

var fetchedResultsController: NSFetchedResultsController 
    if _fetchedResultsController != nil 
        return _fetchedResultsController!
        

        let fetchRequest = NSFetchRequest()
        // Edit the entity name as appropriate.
        let entity = NSEntityDescription.entityForName("OneItemCD", inManagedObjectContext: self.managedObjectContext)
        fetchRequest.entity = entity

        // Set the batch size to a suitable number.
        fetchRequest.fetchBatchSize = 20

        // Edit the sort key as appropriate.
        let sortDescriptor = NSSortDescriptor(key: "content", ascending: false)
        let sortDescriptors = [sortDescriptor]

        fetchRequest.sortDescriptors = [sortDescriptor]

        // Edit the section name key path and cache name if appropriate.
        // nil for section name key path means "no sections".
        let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: "Master")
        aFetchedResultsController.delegate = self
        _fetchedResultsController = aFetchedResultsController

        var error: NSError? = nil
        if !_fetchedResultsController!.performFetch(&error) 

            abort()
        

        return _fetchedResultsController!
    
var _fetchedResultsController: NSFetchedResultsController? = nil


AddViewController:

import UIKit
import CoreData

class AddViewController: UIViewController 


@IBOutlet weak var contentBody: UITextView!

var managedObjectContext: NSManagedObjectContext? = nil

override func viewDidLoad() 
    super.viewDidLoad()

    // Do any additional setup after loading the view.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.



我把我的整个代码都放在了 github:

https://github.com/snowffer/testTableViewForCoreData

【问题讨论】:

该错误意味着您没有托管对象上下文的值。你在哪里设置它并将它传递给你的视图控制器,我看不到上面的代码。 是的,我没有给上下文赋值。我正在努力,会再试一次。 【参考方案1】:

当您设置var fetchedResultsController 时,您的managedObjectContext 仍然是nil。因此,当您声明时,您的应用会崩溃:

let entity = NSEntityDescription.entityForName("OneItemCD", inManagedObjectContext: self.managedObjectContext)

确保在调用上一行代码之前正确设置managedObjectContext

还有一件事

要将OneItemCD 的 Swift 子类与您的 Core Data 模型一起使用,请在模型实体检查器的 Class 字段中的类名称前加上您的模块名称,就像这样:“testTableViewCoreData.OneItemCD”(查看更多关于核心数据和命名空间here)。

【讨论】:

您的意思是我需要将我的核心数据模块文件从 OneItemCD 重命名为 testTableViewCoreData.OneItemCD? 点击我在回答中提供的链接,然后转到页面底部。图片将向您展示如何命名您的实体类,以便 Core Data 与您的 OneItemCD.swift 文件一起使用。 感谢您的回答,我终于解决了我的问题,是的,关于“还有一件事”。这是我没有注意到的问题。

以上是关于iOS:Swift:核心数据:错误:+entityForName:nil 不是搜索实体名称的合法 NSManagedObjectContext 参数的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift 3核心数据-尝试递归调用-save的致命错误:上下文中止

iOS 14 Beta - Swift UI 中的核心数据错误:任何模型中都没有 NSEntityDescriptions 声明 NSManagedObject 子类

Swift 核心数据问题

Xcode Entity Core Data - NSDate 错误的年份? [复制]

在核心数据swift ios中使用未解析的标识符“模型”

我在 iOS 中有一些问题 swift 核心数据