首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理UIManagedDocument?

如何处理UIManagedDocument?
EN

Stack Overflow用户
提问于 2012-02-01 00:25:45
回答 1查看 5.5K关注 0票数 3

首先,我应该提到这是我在这个网站上的第一篇文章。我正试图自学如何编写iOS程序,在我的谷歌搜索结果中,我发现我经常被引导到这里。因此,感谢所有在这里做出贡献的人。你已经帮了我很多忙了。

我已经参加了斯坦福大学的CS193P课程,我很喜欢它。但我现在被困住了,不知道该向哪里求助。

我的问题在于UIManagedDocument。

我试着做一个简单的应用程序来测试我的新技能。这就是它的作用:

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

我有一个UITabBar,在每个选项卡上允许您: 1.跟踪参与者(玩家)-这将连接到通讯簿,并允许您添加他们或只是将他们保留在此应用程序中。2.管理事件( events ) -您可以添加、编辑或删除事件,然后将参与者添加到其中,然后能够添加他们在该事件中带来的内容(银行)。3.设置。-我添加了一些按钮,只是为了帮助我弄清楚一些东西,包括一个清除所有数据的重置按钮和一个“虚拟数据”按钮。

我有三个coreData实体。玩家、事件和银行都与其他两个有关系。

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

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

代码语言:javascript
复制
+ (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打开文档并执行获取。

从那时起,我通过段将选择的任何NSManagedObject传递给下一个ViewController。

问题是当我开始添加或重置数据时。(我假设如果我能让它与“虚拟数据”按钮一起工作,我就能让它在单个条目上工作)当我按下“重置”或“虚拟”按钮时,我的日志告诉我它是被按下的,但在我重新启动应用程序之前,我看不到数据有任何变化。然后它就会完美地显示出来。我的猜测是我没有正确地保存文件,或者我没有正确地刷新tableViews。我尝试过使用NSNotification,但并没有深入研究,因为我不能让它对任何东西做出响应。如果我需要的话,我很乐意回到那条路上。

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

代码语言:javascript
复制
- (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);
              }];

}

CS193P的讲师保罗在作业6中建议使用帮助器方法在块中传递UIManagedDocument。我得到了积木背后的理论,但还没有完全理解它们,所以我不排除我的答案可能也在那里。

非常感谢你的帮助,或者给我指明了做更多研究的正确方向。抱歉,这篇文章太长了,我已经尽量说清楚了。

EN

回答 1

Stack Overflow用户

发布于 2012-02-13 09:04:55

我把整件事都想多了。Alan在这篇文章中完美地问了我一个问题:

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

这个问题和答案把一切都搞清楚了。

谢谢

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9083088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档