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 子类