Pregunta

Tengo una subclase NSPersistentDocument utilizando subclases nsmanageBject para mis datos.

Cuando se abre un nuevo documento, hago una inicialización de estructuras de datos (cantidad trivial de campos de población). Lo que he notado es que el documento sin título se produce automáticamente, y cuando la aplicación vuelve a abrir, ese documento se carga. Si la aplicación lo deja, al usuario no (por defecto) no se le solicita con el cuadro de diálogo Guardar. Si la ventana se cierra, el usuario sí.

Primera pregunta:

Quiero llamar al cuadro de diálogo Guardar cuando el usuario deje de la aplicación. No quiero que este documento sin título se diga (en circunstancias normales). O lo quiero guardado o destrozado.

Intenté completar:

- (void)applicationWillTerminate:(NSNotification *)aNotification

Para activar el documento que se guardará. Vocación save: en el contexto en este punto da un error. Por lo que puedo decir, esto se debe a que el usuario aún no ha guardado el archivo por su cuenta. Además, llamando [self close]; o [[self windowForSheet] close]; Cierre la ventana sin guardar.

¿Cómo puedo forzar el diálogo Guardar a surgir? ¿Cómo puedo destrozar el documento sin título?

Segunda pregunta (no, no puedo contar):

Desde que comienza la aplicación, puede o no haber un documento sin título para tratar, estoy tratando de realizar un seguimiento del estado en otro modelo. Ya descubrí que los datos iniciales (a los que me referí anteriormente) están presentes cuando surgió el documento sin título. Mi otro modelo tiene algunos metadatos, incluido un indicador/estado de éxito para los datos poblados. Una vez que los datos poblados están en su lugar y correcto, el estado indica como tal. Desafortunadamente, aunque mis datos poblados se están cargando cuando la aplicación comienza con un documento sin título preexistente, la clase de metadatos no lo es.

Disculpe la rugosidad del código, en este punto, lo estoy preparando hasta que pueda ver que funciona como quiero antes de pulirlo:

- (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;
}

Tenga en cuenta que la matriz siempre está presente, y el recuento siempre es cero. No, no estoy llamando explícitamente save: en cualquier sitio. Confío en el estándar de Save Auto, o el usuario que realiza un Guardar.

EDITAR:

Instalé la aplicación Core Data Editor. Resulta que el problema no está en guardar los datos, sino en cargarlos. (Nota: Debido a otro problema, la aplicación guarda como binaria cuando se le indica que ahorre como XML, lo que causa muchos golpes en la cabeza).

Lo he roto al código más simple, que debería recoger todos los objetos de tipo Gamestate en una matriz. No recupera ninguno, a pesar de que claramente hay objetos del tipo apropiado en el archivo guardado:

  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];

La matriz no es nula, pero [array count] es 0.

En este punto, supongo que es algo simple que estoy pasando por alto.

Segunda edición:

yo añadí -com.apple.CoreData.SQLDebug 5 y guardado como sqlite. La llamada a executeFetchRequest No genera ningún registro de depuración. Veo el INSERT INTO ZGAMESTATE Entrada aparece en los registros. Parece que executeFetchRequest no se pasa al backend.

Tercera edición (este quema):

Creé un nuevo proyecto XCode, utilizando datos principales (como tenía con el otro). Copié solo esta función (stubring cuando sea necesario) y le puse una llamada en windowControllerDidLoadNib. En este nuevo proyecto, el código anterior funciona.

No hay solución correcta

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top