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

Core data CoreData自动保存并在自动保存后不加载所有数据,core-data,nspersistentdocument,Core Data,Nspersistentdocument,我有一个NSPersistentDocument子类,它使用NSManagedObject子类作为我的数据 打开新文档时,我会初始化一些数据结构(填充字段的数量很少)。我注意到,无标题的文档会自动保存,当应用程序重新打开时,该文档会被加载。如果应用程序退出,用户(默认情况下)不会收到保存对话框的提示。如果窗口关闭,则用户会关闭 第一个问题: 我想在用户退出应用程序时调用保存对话框。我不想让这个没有标题的文件(在正常情况下)到处流传。我要么想把它保存起来要么扔掉 我试图填写: - (void)ap

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

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

第一个问题:

我想在用户退出应用程序时调用保存对话框。我不想让这个没有标题的文件(在正常情况下)到处流传。我要么想把它保存起来要么扔掉

我试图填写:

- (void)applicationWillTerminate:(NSNotification *)aNotification
以触发要保存的文档。此时在上下文上调用
save:
,会出现错误。据我所知,这是因为用户还没有自己保存文件。另外,调用
[自关闭]
[[self windowForSheet]关闭]关闭窗口而不保存

如何强制弹出“保存”对话框?我怎样才能把这个没有标题的文件扔掉

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

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

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

- (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;
}
请注意,数组始终存在,计数始终为零。不,我没有在任何地方显式调用
save:
。我依赖于标准的自动保存,或者用户执行保存

编辑:

我安装了核心数据编辑器应用程序。事实证明,问题不在于保存数据,而在于加载数据。(注意:由于另一个问题,当指示将应用程序另存为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
不会生成任何调试日志。我确实看到日志中显示了
插入ZGAMESTATE
条目。似乎没有将
executeFetchRequest
传递到后端

第三次编辑(本次编辑):

我使用核心数据创建了一个新的xcode项目(正如我对其他项目所做的那样)。我只复制了这一个函数(必要时进行stubing),并在
windowcontrolleridloadnib
中对其进行了一次调用。在这个新项目中,上述代码起作用。

发现了问题


我错误地在
文档
-(id)init
调用中加载对象。移动到
WindowControllerIDLoadNib
(这是我在测试版本中所做的),它工作正常。

引用了头部撞击问题: