2011-10-30 4 views
4

У меня есть уже существующий проект, к которому я добавил модели Core Data. Я добавил базовую структуру данных, добавил модель данных с сущностями и включил ее в цель моего приложения, а также некоторые сгенерированные классы NSManagedObject. Он компилируется красиво, и теперь я хотел бы добавить некоторые тесты для созданных мной объектов. После these instructions, я создал базовый класс логики тест с помощью метода 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. Я пропустил какой-то важный шаг, чтобы собрать мои модели?

+0

Вы имеете в виду, что вы добавили объекты в свою модель, или вы добавили фактические экземпляры объектов с данными в них? – jrturton

+0

В базовых данных много ленивой загрузки - документы говорят, что загрузка модели не обязательно загружает объекты - что происходит, если вы регистрируете [модели объектов]? – jrturton

+0

@jrturton: Я добавил объекты в свою модель. [model entity] возвращает пустой массив. – theory

ответ

5

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

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

Отлично, этот ответ помог мне, спасибо. Но я использовал код Apple для работы с Core Data, поэтому я только что изменил '[NSBundle mainBundle];' to '[NSBundle bundleWithIdentifier: @" com.example. someProject "];' – derpoliuk

0

Посмотрите здесь. Я использую код, который создается при создании проекта с помощью 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; 
} 
+0

Я тоже пробовал, но не смог понять, чего не хватает, но я снова налью его. – theory

+0

Нет, нет радости. :-( – theory

0

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

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

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