覆盖UIManagedDocument中的managedObjectModel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了覆盖UIManagedDocument中的managedObjectModel相关的知识,希望对你有一定的参考价值。

我正在使用ios 5.0中的新UIDocument功能。我有一个使用多个不同数据模型(momd文件)的现有应用程序。根据UIManagedDocument的文档,您可以覆盖 - (NSManagedObjectModel *)managedObjectModel来加载特定的数据模型(默认是加载所有找到的数据模型合并在一起)。两个数据模型都具有重叠的模型名称和不同的模式,因此在我的情况下这是不可取的。

Relevant Apple Doc

所以,我在一个简单的示例中遇到的问题是,我可以覆盖该函数,但我无法分配它的结果。它都是私有的,因此子类无法访问_managedObjectModel;并且,它是只读的,因此无法分配self.managedObjectModel ..

我找到了一个覆盖managedObjectModel的UIManagedDocument示例,但Apple似乎没有提供。

我可能能够定义一个新的实例变量_myManagedObjectModel并分配它。然后返回我在覆盖的访问器上的那个。我担心的是,可能会破坏UIManagedDocument的一些内部实现,该实现不使用managedObjectModel访问器而优先于_managedObjectModel(在Apples实现中常见...)

看起来像一个直接的问题,我怀疑我只是缺少一些非常简单的东西,允许适当的覆盖。

//
//  DTNoteDocument.m
//  document-test
//
//

#import "DTNoteDocument.h"

@implementation DTNoteDocument

NSString * const kDataManagerModelName = @"Note";

-(NSManagedObjectModel*)managedObjectModel {

    if (_managedObjectModel != nil)
        return _managedObjectModel;

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; // compile error on this line, private variable cannot be assigned

    return _managedObjectModel;
}
@end

标题:

#import <UIKit/UIKit.h>

@interface DTNoteDocument : UIManagedDocument

@end
答案

我上周解决了这个问题,但我想我会更新以反映我的解决方案。如果你找到更好的东西,我会很高兴看到它。

我为我的类标题添加了一个唯一的属性:

@property (nonatomic,retain,readonly) NSManagedObjectModel *myManagedObjectModel;

然后将以下内容添加到我的类实现中:

-(NSManagedObjectModel*)myManagedObjectModel {
    if (myManagedObjectModel)
        return myManagedObjectModel;

    NSBundle *bundle = [NSBundle mainBundle];
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"];
    myManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]];

    return myManagedObjectModel;
}

-(NSManagedObjectModel*)managedObjectModel {
    return self.myManagedObjectModel;
}

由于我可以覆盖managedObjectModel的get属性,因此效果相当不错。到目前为止,UIManagedDocument在我的测试和实现中初始化并正常工作。执行跟踪显示在init上调用managedObjectModel,因此我假设从返回的结果中正确初始化了所有内容。

另一答案

最后,我发现了你的解决方案的问题。 UIManagedDocument应该允许我们更改objectmodelLoading选项...

你的代码中缺少这个:

.m文件

#import <CoreData/CoreData.h>

@implementation DTNoteDocument{
    NSManagedObjectModel * myManagedObjectModel;
}

以上是关于覆盖UIManagedDocument中的managedObjectModel的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 UIManagedDocument 中的冲突?我应该使用 NSFileVersion 吗?

UIManagedDocument 中对父 NSManagedObjectContext 的后台队列更改导致合并时 NSFetchedresultsController 中的重复

无法创建 UIManagedDocument

UIManagedDocument 的迁移问题

UIManagedDocument 和 NSFetchedResultsController

从 UIManagedDocument 到普通堆栈的核心数据迁移