Where are my main data objects?

I have an existing project to which I have added Core Data models. I added a basic data structure, added a data model with entities and included it in my target program, as well as some of the generated NSManagedObject classes. It compiles nicely, and now I would like to add some tests for the objects I created. Following these instructions , I installed the base class of logical tests using the setUp method:

 - (void)setUp { model = [NSManagedObjectModel mergedModelFromBundles:nil]; NSLog(@"model: %@", model); coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; store = [coord addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL]; ctx = [[NSManagedObjectContext alloc] init]; [ctx setPersistentStoreCoordinator:coord]; } 

This compiles and all objects are created. However, the model has no entities! The output of NSLog() looks like this:

 2011-10-29 23:56:58.941 otest[42682:3b03] model: (<NSManagedObjectModel: 0x19c6780>) isEditable 1, entities { }, fetch request templates { } 

So where are my entities? I poked around the package and there are no .momd files. Did I miss some important step to assemble my models?

+4
source share
3 answers

I did some extra duck duck going ing and was able to find the information I needed in this answer . The result is that since the test target does not use the “main” package, I need to instantiate the test package. Therefore, instead of this line:

  model = [NSManagedObjectModel mergedModelFromBundles:nil]; 

Now I have these three lines:

  NSBundle *bundle = [NSBundle bundleWithIdentifier:@"com.example.LogicTests"]; NSURL *url = [bundle URLForResource:@"MyModels" withExtension:@"momd"]; model = [[NSManagedObjectModel alloc] initWithContentsOfURL:url]; 

The bundle identifier comes directly from my target assembly information, while “MyModels” comes from my data model file, called “MyModels.xcdatamodeld” and is included in the application package as “MyModels.momd”. And that, of course, contains my models.

+5
source

Look at here. I use the code that is generated when creating the project using CoreData. I hope this helps you solve your problems:

pragma sign main data stack

 @property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel; @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; /** Returns the managed object context for the application. If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. */ - (NSManagedObjectContext *) managedObjectContext { if (managedObjectContext != nil) { return managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator: coordinator]; } return managedObjectContext; } /** Returns the managed object model for the application. If the model doesn't already exist, it is created by merging all of the models found in the application bundle. */ - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; return managedObjectModel; } /** Returns the persistent store coordinator for the application. If the coordinator doesn't already exist, it is created and the application store added to it. */ - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreDB.sqlite"]]; NSError *error = nil; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { /* Replace this implementation with code to handle the error appropriately. abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. Typical reasons for an error here include: * The persistent store is not accessible * The schema for the persistent store is incompatible with current managed object model Check the error message to determine what the actual problem was. */ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return persistentStoreCoordinator; } 
0
source

If your database is inside / from the framework, you need to download it using the appropriate package.

I found a solution in Swift with MagicalRecord :

 let frameworkBundle = Bundle(for: AClassFromTheFramework.self) let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle]) MagicalRecord.setShouldAutoCreateManagedObjectModel(false) NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel) MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: "db.sqlite") 

Loading a managed object model from a package and setShouldAutoCreateManagedObjectModel set to false did the trick!

0
source

All Articles