5

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

相关苹果文档

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

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

我也许可以定义一个新的实例变量 _myManagedObjectModel 并分配它。然后在我覆盖的访问器上返回它。我担心的是,这可能会破坏 UIManagedDocument 的一些内部实现,它不使用 managedObjectModel 访问器而不是 _managedObjectModel (这在苹果的实现中经常看到......)

似乎是一个直截了当的问题,我怀疑我只是错过了一些非常简单的东西来允许适当的覆盖。

//
//  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
4

2 回答 2

5

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

我在我的类头中添加了一个独特的属性来开始:

@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 在我的测试和实现中初始化并运行良好。跟踪显示 managedObjectModel 在 init 上被调用,所以我假设一切都从返回的结果正确初始化。

于 2011-10-31T20:10:00.137 回答
0

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

您的代码中缺少以下内容:

.m 文件

#import <CoreData/CoreData.h>

@implementation DTNoteDocument{
    NSManagedObjectModel * myManagedObjectModel;
}
于 2012-05-25T10:50:34.543 回答