Где мои основные объекты данных? - PullRequest
4 голосов
/ 30 октября 2011

У меня есть уже существующий проект, к которому я добавил модели базовых данных. Я добавил инфраструктуру Core Data, добавил модель данных с сущностями и включил ее в цель моего приложения вместе с некоторыми сгенерированными NSManagedObject классами. Он прекрасно компилируется, и теперь я хотел бы добавить несколько тестов для созданных мною сущностей. Следуя этим инструкциям , я настроил базовый класс логического теста с помощью метода setUp следующим образом:

- (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];
}

Это компилирует и все объекты создаются. Однако модель не имеет сущностей! Вывод NSLog() выглядит так:

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

Так, где мои сущности? Я обшарил пакет, и файлов .momd тоже нет. Я пропустил какой-то решающий шаг, чтобы собрать свои модели?

Ответы [ 3 ]

6 голосов
/ 04 ноября 2011

Я сделал несколько дополнительных действий Duck Duck Go и смог найти нужную мне информацию в этом ответе .В результате, поскольку цель тестирования не использует «основной» комплект, я должен создать экземпляр комплекта тестов.Таким образом, вместо этой строки:

    model = [NSManagedObjectModel mergedModelFromBundles:nil];

Теперь у меня есть эти три строки:

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

Идентификатор пакета приходит непосредственно из моей целевой информации о сборке, в то время как "MyModels" происходит из моих данныхфайл модели, который называется «MyModels.xcdatamodeld» и включен в комплект приложения как «MyModels.momd».И это, конечно, содержит мои модели.

0 голосов
/ 04 января 2018

Если ваша база данных находится в / из фреймворка, вам нужно загрузить ее, используя соответствующий пакет.

Я нашел решение в Swift с 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")

Загрузка управляемой объектной модели из комплекта и setShouldAutoCreateManagedObjectModel, установленной на false, сделали свое дело!

0 голосов
/ 30 октября 2011

Смотри здесь. Я использую код, который генерируется при создании проекта с CoreData. Я надеюсь, что это поможет вам решить ваши проблемы:

Прагма Марк Базовый стек данных

@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's 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;
}
...