你如何处理UIManagedDocument?

时间:2012-01-31 16:25:45

标签: core-data ios5 uimanageddocument

首先,我应该提一下,这是我在这个网站上的第一篇文章。我正在尝试自学iOS程序,并在我的谷歌搜索中找到答案,我发现我一直在这里。非常感谢所有在此做出贡献的人。你已帮我一吨了。

我一直在参加斯坦福大学CS193P课程并且喜欢它。但我现在卡住了,不知道该转向何处。

我的问题出在UIManagedDocument上。

我厌倦了制作一个简单的应用来测试我的新技能。这就是它的作用:

一个简单的会计应用程序,用于跟踪个人对筹款活动的贡献。

我有一个UITabBar,每个标签上都允许您: 1.跟踪参与者(玩家) - 这将连接到地址簿,允许您添加或只是将它们保存在此应用程序中。 2.管理事件(事件) - 您可以添加,编辑或删除随后添加参与者的事件,然后可以添加他们带来的事件(Bank)。 3.设置。 - 我已经添加了一些按钮,只是为了帮助我解决现在的问题,包括一个清除所有数据的复位按钮和一个虚拟数据"按钮。

我有三个coreData实体。玩家,活动和银行各自与其他两个人有关系。

当我第一次尝试制作这个应用程序(iOS5之前)时,我使用appDelegate创建了我的ManagedObjectContext并将其传递给我的viewControllers。那很有效。但是现在我应该使用UIManagedObjectDocument而不使用AppDelegate。我相信我理解iCloud的原理和集成。 (我可能错了)

使用类中的示例和我在网上找到的内容,我创建了一个帮助类,它将在我的UINavigationControllers中为ManagedDocument提供每个ViewControllers中的第一个。

+ (UIManagedDocument *)sharedManagedDocument
{
    static UIManagedDocument *sharedDocument = nil;

    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"DefaultAppDatabase"];
    // url is "<Documents Directory>/<DefaultAppDatabase>"

    // Create the shared instance lazily upon the first request.
    if (sharedDocument == nil) {
        sharedDocument = [[UIManagedDocument alloc] initWithFileURL:url];
    }

    if (sharedDocument.fileURL != url) {
        UIManagedDocument *newDocument = [[UIManagedDocument alloc] initWithFileURL:url];
        sharedDocument = newDocument;
    }

    NSLog(@"SharedDocument: %@", sharedDocument);

    return sharedDocument;
}

然后我让第一个ViewController打开文档并执行获取。

从那里我通过segue将所选的NSManagedObject传递给下一个ViewController。

问题出在我添加或重置数据时。 (我假设如果我可以使用&#34;虚拟数据&#34;按钮我可以让它在单个条目上工作)当我按下&#34;重置&#34;或者&#34; Dummy&#34;按钮我的日志告诉我它已被推送但我没有看到数据的任何变化,直到我重新启动应用程序。然后它完美地显示出来。我的猜测是我没有正确保存文件,或者我没有正确刷新tableViews。我尝试使用NSNotification,但没有深入研究,因为我无法对它做出任何回应。如果需要的话,我很乐意回到那条路上。

这是我的保存方法......几乎只是从默认的coreData appDelegate复制而来。

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.appDatabase.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }

    [self.appDatabase saveToURL:self.appDatabase.fileURL
               forSaveOperation:UIDocumentSaveForOverwriting
              completionHandler:^(BOOL success){
                  if(!success) NSLog(@"failed to save document %@", self.appDatabase.localizedName);
                  if(success) NSLog(@"Success: save document %@", self.appDatabase.localizedName);
              }];

}

Paul,CS193P的讲师,在作业6中建议使用辅助方法通过块传递UIManagedDocument。我得到了积木背后的理论,但我并没有完全包围他们,所以我没有排除我的答案也可能就在那里。

非常感谢您的帮助或指导我做正确的方向进行更多的研究。对不起,这篇文章太长了,我试着尽可能地清楚。

1 个答案:

答案 0 :(得分:2)

我在思考整件事。艾伦在这篇文章中完美地提出了我的问题:

How do I create a global UIManagedDocument instance per document-on-disk shared by my whole application using blocks?

问题和答案清除了一切。

由于