5

我找到了这些斯坦福教程https://itunes.apple.com/us/course/ipad-iphone-app-development/id495052415,并且一直在听关于核心数据的讲座,这真的很棒。

它显示了如何通过UIManagedDocument...访问核心数据...唯一的事情我不明白UIManagedDocument它应该使用哪个模型,因为我没有看到它在任何地方设置?

总结一下,使用UIManagedDocument时如何定义要使用的数据库模型?

4

2 回答 2

6

我找到了答案:

'UIManagedDocument' 从应用程序的主包中获取所有模型,并将这些模型合并。如果您只有一个模型,则使用该模型。

这可以通过覆盖“UIManagedDocument”类来改变。

于 2013-02-05T12:42:45.227 回答
1

加载数据模型 在某些情况下,您不必编写任何代码来加载模型。如果您在 OS X 上使用基于文档的应用程序,NSPersistentDocument 会为您管理查找和加载应用程序模型的任务。如果您使用 Xcode 创建使用 Core Data(对于 OS X 或 iOS)的非文档应用程序,则应用程序委托包含用于检索模型的代码。模型的名称(由用于将其存储在磁盘上的文件名表示)在运行时不相关。一旦模型被 Core Data 加载,文件名是没有意义的,没有任何用处,所以你可以随意命名模型文件。

如果您想自己加载模型,可以使用两种机制:

您可以使用实例方法 initWithContentsOfURL: 从特定 URL 加载单个模型。这是通常首选的技术。通常,应用程序只有一个模型,使用这种方法可以确保只加载该模型。您还可以通过 URL 加载单个模型,然后使用 modelByMergingModels: 统一它们,然后用它们实例化协调器。

在您拥有多个模型的情况下——特别是在模型代表同一模式的不同版本的情况下——知道要加载哪个模型是必不可少的(在运行时将具有相同实体的模型合并到一个集合中会导致命名冲突和错误)。如果您想将模型存储在应用程序的包之外,此方法也很有用,因此需要通过文件系统 URL 引用它。

您可以使用类方法mergedModelFromBundles: 从特定的bundle 集合创建合并模型。这种方法在模型分离不重要的情况下可能很有用——例如,您可能知道您的应用程序和它链接到的框架都有您需要或想要加载的模型。类方法允许您轻松地一次加载所有模型,而无需考虑名称是什么,或者放入专门的初始化代码以确保找到所有模型。

在运行时访问和使用托管对象模型

    NSManagedObjectModel *model = <#Get a model#>;
NSFetchRequest *requestTemplate = [[NSFetchRequest alloc] init];
NSEntityDescription *publicationEntity =
    [[model entitiesByName] objectForKey:@"Publication"];
[requestTemplate setEntity:publicationEntity];

NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:
    @"(mainAuthor.firstName like[cd] $FIRST_NAME) AND \
        (mainAuthor.lastName like[cd] $LAST_NAME) AND \
        (publicationDate > $DATE)"];
[requestTemplate setPredicate:predicateTemplate];

[model setFetchRequestTemplate:requestTemplate
    forName:@"PublicationsForAuthorSinceDate"];

使用获取请求模板

NSManagedObjectModel *model = <#Get a model#>;
NSError *error = nil;
NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
    @"Fiona", @"FIRST_NAME", @"Verde", @"LAST_NAME",
    [NSDate dateWithTimeIntervalSinceNow:-31356000], @"DATE", nil];
NSFetchRequest *fetchRequest =
    [model fetchRequestFromTemplateWithName:@"PublicationsForAuthorSinceDate"
            substitutionVariables:substitutionDictionary];
NSArray *results =
    [aManagedObjectContext executeFetchRequest:fetchRequest error:&error];
于 2013-02-05T11:19:37.190 回答