5

我有一个预先存在的项目,我已经向其中添加了核心数据模型。我添加了 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文件。我是否错过了构建模型的关键步骤?

4

3 回答 3

7

我做了一些额外的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”。当然,这包含我的模型。

于 2011-11-04T04:29:11.507 回答
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;
}
于 2011-10-30T07:42:47.930 回答
0

如果您的数据库在框架内/来自框架,则需要使用相应的 Bundle 加载它。

我在 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成功!

于 2018-01-03T21:50:50.473 回答