【问题标题】:Core Data Model path vs Store path核心数据模型路径和存储路径
【发布时间】:2012-06-26 05:40:58
【问题描述】:

以前,我有一个使用核心数据的应用。我使用相同的商店 url 来初始化 NSManagedObjectModel 并创建 NSPersistentStoreCoordinator。但是,在新的应用程序中,我尝试使用相同的方式,无法创建模型。所以我必须使用模型 url(我在这个论坛中找到它)才能创建 NSManagedObjectModel。有什么问题?

这是来自旧应用程序:

- (NSString *)storeName
{
    return @"ABC.storedata";
}

- (NSURL *)storeUrl
{
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName];
    return storeURL;
}

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel == nil) {
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self storeUrl]];
    }
    return _managedObjectModel;
}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }    
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) {

       abort();
    }    

    return _persistentStoreCoordinator;
}

这是来自新应用:

- (NSString *)storeName
{
    return @"DEF.sqlite";
}

- (NSURL *)storeUrl
{
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:self.storeName];
    return storeURL;
}

- (NSURL *)modelUrl
{
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DEF" withExtension:@"momd"];
    return modelURL;
}

- (NSManagedObjectModel *)managedObjectModel {
    if (_managedObjectModel == nil) {
        _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[self modelUrl]];
    }
    return _managedObjectModel;
}


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }    
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeUrl] options:nil error:&error]) {

       abort();
    }    

    return _persistentStoreCoordinator;
}

【问题讨论】:

    标签: objective-c core-data ios5


    【解决方案1】:

    您永远不能对模型存储和持久存储使用相同的 URL,因为它们是两个非常不同的东西。

    模型 URL 必须指向 Xcode 项目中包含的实际模型资源,它是一个 .momd 文件包。在您的情况下,持久存储是一个数据库,一个文档目录中的 .sqlite 文件。

    我无法想象它在过去是如何运作的。一种可能性是,由于您的 ABC.storedata 没有尾随 .sqlite,Core Data 一定在后台添加了一个 .sqlite,而 DEF.storedata 可能以某种方式与您的模型名称匹配?

    这是初始化模型的正确方法,您将“模型”替换为您在 Xcode 项目中用于模型资源的名称:

    NSURL *modelURL             = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];        
    model                       = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    

    对于持久存储,没有任何限制。在大多数情况下,它应该在应用程序文档目录中。

    【讨论】:

    • 好的。你说的对。我明白了 OLD 应用程序运行的原因。旧应用程序使用 mergeModelFromBundles,而不是 initWithContentsOfURL。
    猜你喜欢
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多