CoreData自动保存并且在自动保存后不加载所有数据

时间:2012-02-22 23:52:08

标签: core-data nspersistentdocument

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

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

第一个问题:

我想在用户退出应用程序时调用保存对话框。我不希望这个无标题文档挂在身边(正常情况下)。我想要它保存或删除。

我试图填写:

- (void)applicationWillTerminate:(NSNotification *)aNotification

为了触发要保存的文档。此时在上下文中调用save:会出错。据我所知,这是因为用户尚未保存文件。此外,调用[self close];[[self windowForSheet] close];关闭窗口而不保存。

如何强制保存对话框出现?如何删除无标题文档?

第二个问题(不,我不能算):

因为应用程序启动时,可能会或可能没有要处理的无标题文档,我正在尝试跟踪另一个模型中的状态。我已经发现,当Untitled文档出现时,初始数据(我之前提到过)就出现了。我的其他模型有一些元数据,包括填充数据的成功标志/状态。一旦填充的数据全部到位并且正确,状态就表明如此。不幸的是,当应用程序以预先存在的Untitled文档启动时,正在加载我的填充数据,而元数据类则不是。

请原谅代码的粗糙程度,此时,我正在弄清楚它,直到我能够看到它正在按照我想要的方式工作,然后再将其抛光:

- (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:。我依赖于标准自动保存或执行保存的用户。

编辑:

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

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

  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中调用了它。在这个新项目中,上面的代码可以工作。

1 个答案:

答案 0 :(得分:0)

发现问题。

我错误地在Document的{​​{1}}电话中加载了对象。已移至- (id) init(这是我在测试版中所做的)并且运行正常。