首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoreData自动保存,自动保存后不加载所有数据

CoreData自动保存,自动保存后不加载所有数据
EN

Stack Overflow用户
提问于 2012-02-23 07:52:08
回答 1查看 684关注 0票数 0

我的数据有一个使用NSManagedObject子类的NSPersistentDocument子类。

当打开一个新文档时,我会对数据结构进行一些初始化(少量的填充字段)。我注意到的是,无标题文档被自动保存,当应用程序重新打开时,该文档被加载。如果应用程序退出,用户(默认情况下)不会收到保存对话框的提示。如果窗口关闭,用户就会关闭。

第一个问题:

当用户退出应用程序时,我想调用保存对话框。我不想让这个无标题的文档挂在那里(在正常情况下)。我不是想让它得救就是把它扔了。

我试着填写:

代码语言:javascript
复制
- (void)applicationWillTerminate:(NSNotification *)aNotification

以便触发要保存的文档。此时在上下文上调用save:会产生错误。据我所知,这是因为用户还没有自己保存文件。此外,调用[self close];[[self windowForSheet] close];将关闭窗口而不保存。

如何强制弹出保存对话框?如何将无标题的文档丢弃?

第二个问题(不,我数不过来):

因为当应用程序启动时,可能有也可能没有要处理的无标题文档,所以我正在尝试跟踪另一个模型中的状态。我已经发现,当无标题文档出现时,初始数据(我前面提到的)就存在了。我的另一个模型有一些元数据,包括填充数据的成功标志/状态。一旦填充的数据都正确无误,状态就会显示出来。不幸的是,当应用程序使用预先存在的无标题文档启动时,虽然我填充的数据正在加载,但元数据类却不是。

请原谅代码的粗糙,在这一点上,我正在把它弄得一团糟,直到我看到它按我想要的方式工作,然后再把它擦掉:

代码语言:javascript
复制
- (bool) createGameState {
  NSEntityDescription* description = [NSEntityDescription entityForName:[GameState name] inManagedObjectContext:[self managedObjectContext]];
  NSFetchRequest* req = [[NSFetchRequest alloc] init];
  [req setEntity:description];

  NSError *error = nil;
  NSArray *array = [[self managedObjectContext] executeFetchRequest:req error:&error];
  [req release];
  req = nil;

  GameState* result = nil;
  if (array) {
    NSUInteger count = [array count];
    if (!count) {
      // Create the new GameState.
      DebugLog(@"Creating GameState");
      result = [NSEntityDescription insertNewObjectForEntityForName:[GameState name] inManagedObjectContext:[self managedObjectContext]];
      [result setIsLoaded:[NSNumber numberWithBool:NO]];
    } else {
      if (count > 1) {
        NSLog(@"WARNING: Potentially Corrupt Game State. found: %lu", count);
      }
      result = [array objectAtIndex:0];
      if ([result isLoaded]) {
        [self variantLoaded];
      } else {
        // In this case, we have an aborted set-up. Since the game isn't
        // playable, just refuse to create the GameState. This will
        // force the user to create a new game.
        return NO;
      }
    }
  } else {
    DebugLog(@"error: %@", error);
  } 

  [game setState:result];
  return result;
}

请注意,数组始终存在,且count始终为零。不,我并没有显式地调用save: anywhere。我依赖于标准的自动保存,或者用户执行保存。

编辑:

我安装了Core Data Editor应用程序。事实证明问题不在于保存数据,而在于加载数据。(注意:由于另一个问题,应用程序在被指示保存为XML时保存为二进制,这会导致很多麻烦。)

我已经将它分解为最简单的代码,它应该提取数组中所有类型为GameState的对象。它不检索任何对象,尽管在保存的文件中明显存在适当类型的对象:

代码语言:javascript
复制
  NSManagedObjectContext* moc = [self managedObjectContext];
  NSEntityDescription* entity = [NSEntityDescription entityForName:@"GameState" inManagedObjectContext:moc];

  NSFetchRequest* req = [[NSFetchRequest alloc] init];
  [req setEntity:entity];


  NSError *error = nil;
  NSArray *array = [moc executeFetchRequest:req error:&error];

数组不为空,可[array count]为0。

在这一点上,我猜这是我忽略的一些简单的东西。

第二次编辑:

我添加了-com.apple.CoreData.SQLDebug 5并另存为SQLite。对executeFetchRequest的调用不会生成任何调试日志。我确实在日志中看到了INSERT INTO ZGAMESTATE条目。看起来executeFetchRequest没有被传递到后端。

第三次编辑(这一次刻录):

我使用核心数据创建了一个新的xcode项目(就像我对另一个项目一样)。我只复制了这一个函数(在必要时使用存根),并在windowControllerDidLoadNib中对其进行了调用。在这个新项目中,上面的代码可以正常工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-09 08:36:39

找到了问题所在。

我在Document- (id) init调用中错误地加载了对象,并转移到了windowControllerDidLoadNib (这就是我在测试版本中所做的),它工作得很好。

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

https://stackoverflow.com/questions/9405120

复制
相关文章

相似问题

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