ViewDidLoad中的UIManagedDocument创建

Dog*_*fee 5 core-data uimanageddocument

经过一些研究后,我仍然不确定何时/如何创建我的UIManagedDocument.

@interface ViewController ()
@property (strong, nonatomic) UIManagedDocument *document;
@end

@implementation ViewController

- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];

NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
NSString *documentName = @"MyDocument";
NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[url path]];

if (fileExists) {
    [self.document openWithCompletionHandler:^(BOOL success) {
        NSLog(@"Exsits dont create again");
        if (success) [self documentIsReadyCreateAndObject];
        if (!success) NSLog(@"cound not open document at %@", url);
    }];
}
else {
    // create it
    [self.document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        NSLog(@"Create it");
        if (success) [self documentIsReadyCreateAndObject];
        if (!success) NSLog(@"cound not create document at %@", url);
    }];
}
}

- (void) documentIsReadyCreateAndObject
{
if (self.document.documentState == UIDocumentStateNormal) {
    NSLog(@"document is ready - create obj");
    Car *demo = [NSEntityDescription insertNewObjectForEntityForName:@"Car" inManagedObjectContext:self.document.managedObjectContext];
    demo.carName = @"xxxxx";
}
else {
    NSLog(@"Not ready to go");
}
}

- (void) fetchAndPrint
{
if (self.document.documentState == UIDocumentStateNormal) {
    NSLog(@"document is ready - print objs");
    NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Car"];
    NSArray *results = [self.document.managedObjectContext executeFetchRequest:request error:nil];

    for (Car *aLog in results) {
        NSLog(@"\nNAME: %@", aLog.carName);
    }
}
else {
    NSLog(@"Not ready to go");
}
}

@end
Run Code Online (Sandbox Code Playgroud)

Sco*_*ets 4

视图控制器与应用程序委托

创建您的最佳时间UIManagedDocument在一定程度上取决于具体情况,但我发现在大多数情况下,应用程序的委托是最适合的地方。视图控制器实际上不是创建数据库的地方。大多数时候,您将在应用程序的多个位置使用该数据库,因此创建它实际上并不是一个特定视图控制器的任务。如果您的应用程序的设计发生变化,使得该视图控制器不是屏幕上的第一个控制器,则您必须获取所有代码并将其放入其他视图控制器中。

由于核心数据支持的模型通常需要从许多不同的视图控制器访问,因此我使用应用程序委托。一旦您的应用程序启动,它将创建或打开一个视图控制器可以立即使用的数据库。

这并不意味着您也必须从应用程序委托访问您的文档。关于这是否是好的实践存在很多争论,但我更喜欢将文档传递给任何需要的对象,这样它就不会依赖于应用程序委托的模型。

大多数时候,传递 a 的唯一原因UIManagedDocument是它的NSManagedObjectContext,因此如果您不需要任何其他与文档相关的属性,则可以考虑只传递它。此外,如果您只传递一个NSManagedObject,您将自动访问其上下文,这样就可以减少您必须传递文档的次数。

移民

我将首先回答您的最后一个问题:不,使用传统的核心数据堆栈或UIManagedDocument与迁移(轻量级或使用映射模型)无关。UIManagedDocument有一个persistentStoreOptions属性可以用来为您处理大多数迁移。即使您需要一个映射模型,您也可以创建它,将其添加到您的包中,如果您进行了正确的映射,它将为您完成这一切。