Reputation: 773
I am new to Core Data and I'm trying to create a caching mechanism wherein after parsing objects from the API, I save them to the data model then fetch it again to show it on the tableview. I'm trying to fetch it using NSFetchedResultsController
. Upon initialization of the NSFetchedResultsController
, I'm encountering this runtime exception:
2018-12-09 15:03:20.493509+0800 [5184:148001] [error] error:
No NSEntityDescriptions in any model claim the NSManagedObject subclass
'Product' so +entity is confused. Have you loaded your
NSManagedObjectModel yet ?
CoreData: error: No NSEntityDescriptions in any model claim the
NSManagedObject subclass 'Product' so +entity is confused. Have you
loaded your NSManagedObjectModel yet ?
2018-12-09 15:03:20.493718+0800[5184:148001] [error] error: +
[Product entity] Failed to find a unique match for an
NSEntityDescription to a managed object subclass
CoreData: error: +[Product entity] Failed to find a unique match for an
NSEntityDescription to a managed object subclass
What could be the reason why?
Upvotes: 45
Views: 18353
Reputation: 31
I have checked all above. My case is as simple as I wrote wrong DB(Container) name. Warning and related error disappeared when I put "Some" instead of "SomeApp".
It is (works):
container = NSPersistentContainer(name: "Some")
It was (wrong):
container = NSPersistentContainer(name: "SomeApp")
May be this will be of some help to anybody.
Upvotes: 0
Reputation: 2880
I want to add in my case this error occured after I had moved my xcdatamodeld
and related files to another folder. Deleting and recreating data model file fixed it for me.
If this error occurs after you moved some files something probably was not moved correctly.
Upvotes: 0
Reputation: 546
For anyone who has this problem with hybrid projects (Obj-C + Swift).
In my case, CoreData xcdatamodel is delivered as an asset inside SPM package and is used inside this package. With Swift projects there are no problems but with hybrid one I faced the same issue.
The solution that solved my problem:
use @objc annotation for NSManagedObjects as mentioned by @Sam
@objc(Entity)
public class Entity: NSManagedObject {
}
Use Global namespace instead of Current Product Module for each entity (check @Pomme2Poule's answer how to do that)
Upvotes: 12
Reputation: 330
I've encounter same issue and finally locate the root cause at persistentContainer
lazy initilaize.
In AppDelegate.swift, remove lazy
works for me.
// MARK: - Core Data stack
lazy var persistentContainer: NSPersistentCloudKitContainer = {...}
Upvotes: 2
Reputation: 161
For me, I had not named the NSPersistentContainer in the AppDelegate the same as the xcdatamodelId I had created.
let container = NSPersistentContainer(name: "DataModel")
Upvotes: 1
Reputation: 17695
In my case I was using it SwiftUI the NSManagedObjectContext
was being used before persistent store async function returned.
I then followed the core data sample project with Xcode to solve the issue:
@main
struct TestCoreDataApp: App {
//Inside the PersistenceController initialiser the store is loaded, so gives it time before passing the context to the SwiftUI View
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
}
}
}
Upvotes: 9
Reputation: 5237
If you ever encounter an issue similar to this using SwiftUI, you can try changing the entity's class module from Global Namespace to Current Product Module.
Go to your xcdatamodeld file and select the problematic entity. Then in the data model inspector, change the Module field from the default Global namespace to available value "Current Product Module" by clicking on the arrow at the right of the field.
This allowed my app to compile without encountering the error.
Upvotes: 51
Reputation: 5813
In my case, I had changed the name of an entity and the swift-class but had forgot to update to the new swift-class name in the xcdatamodeld.
(In xcdatamodel view, under "CONFIGURATIONS" in the left pane, select "Default" and make sure the name of the classes are correct.)
Upvotes: 7
Reputation: 1961
My experience:
The entity class was missing the @objc(Person)
line above the class name.
I do have more classes that are working without this line but only when creating this specific entity, I have got this error.
@objc(Person)
public class Person: NSManagedObject {
}
Upvotes: 15
Reputation: 1024
I came across the same issue when I changed the Codegen property of a Core Data Model to the type Category/Extension, to create a custom class for the Core Data Model.
As pointed out by @dypbrg, changing the following code segment
Product.fetchRequest()
to the following code segment
NSFetchRequest<Product>(entityName: "Product")
seems to solve the issue.
Upvotes: 11