Domanda

Ho il seguente problema:

Ho un app con un UITableView come vista root. In questo tableView sono voci diverse e per ogni voce (che può essere creato dall'utente) Ho anche aggiungere un persistentstore al mio app.

Così, quando inizio l'applicazione da zero (non ci sono dati, ecc salvati) e aggiungere una voce, il persistentStore viene creato anche e quando clicco sul tableViewCell, posso salvare i dati in questo generato persistentStore. Questo funziona bene se sto creando una voce e anche guardare la voce durante una singola sessione.

MA

Se chiudo l'applicazione e ricominciare, fare clic sullo stesso ingresso, ricevo il seguente messaggio di errore:

NSFetchRequest *allUsers = [[NSFetchRequest alloc] init];
[allUsers setAffectedStores:[NSArray arrayWithObject:[[self.tableViewContext persistentStoreCoordinator] persistentStoreForURL:storeURL]]];

* Chiusura di applicazione a causa di eccezione non identificata 'NSInvalidArgumentException', la ragione: '* - [NSArray initWithObjects: count:]: tentare di inserire oggetti nil a oggetti [0]'

Così sembra che voglio aggiungere un negozio che è in realtà pari a zero, perché (credo di sì) il sistema non riesce a trovare qualsiasi negozio sotto questo dato storeURL (che è lo stesso di quello in cui ho creato un negozio nel prima esecuzione).

Quindi credo che la persistentStore non c'è nella seconda manche, in modo che non viene salvato correttamente nella prima manche in cui è stato creato.

Così come posso salvare un persistentStore, dopo ho aggiunto che, al persistentStoreCoordinator?

Aggiornamento:

credo di aver identificato il problema principale. Il persistentStoreCoordinator è cambiato dopo la prima manche. Quindi, come faccio a salvare tutte queste cose (managedObjectContext, persistentStoreCoordinator) prima di chiudere l'applicazione?

Qualcuno può aiutarmi?

Aggiorna 2

Ecco come ho creato il negozio:

    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentPath = [searchPaths objectAtIndex:0];
    NSString* storeFileName = [NSString stringWithFormat:@"%@",newItem.name];
    NSURL *storeURL = [NSURL fileURLWithPath:[documentPath stringByAppendingPathComponent:storeFileName]];                            
     NSError* saveToStoreError;
    if(![[self.addContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&saveToStoreError]){
     NSLog(@"Error: %@, %@", saveToStoreError, [saveToStoreError userInfo]);
     abort();
    }
    else
    {
      NSError *saveStoreError;
      if(![self.addContext save:&saveStoreError])
      {
           NSLog(@"Saving Data wasn't possible!");
      }
    }

Aggiorna 3 Così, dopo un sacco di test qui sono i miei risultati:

  • Creazione dei negozi funziona bene. Posso creare più negozi e posso accedere e li popolano finché io sono in un unico passaggio del mio app.

Quindi, qualcosa sta cambiando con il riavvio del mio app. Penso che l'errore deve essere associato al managedObjectContext, la persistentStoreCoordinator o il salvataggio dei negozi.

Devo cambiare le impostazioni nella mia app delegato per l'impostazione della managedObjectContext o persistentStoreCoordinator?

Grazie!

È stato utile?

Soluzione 4

E 'stato semplicemente facile.

Non ho impostato addPersistentStoreWithType dopo il riavvio in una vista in cui ho cercato di recuperare i dati da questo negozio.

Ci scusiamo per questo post. Semplicemente facile ;-) bangingmyheadonthewall

Altri suggerimenti

Il modo in cui esprimere la tua porta problema mi sospettare un qualche tipo di confusione.

che persistentStore sta cambiando dopo ogni riavvio. E 'questo il caso del solito?

Sì, lo è! un NSPersistentStore è un oggetto obiettivo a C come qualsiasi altro oggetto. Come tale, non è persistente in tutta lanci. È necessario ricreare ogni volta.

Cosa c'è di persistente circa NSPersistentStore è il file a cui punta. Ma ogni volta che si esegue l'applicazione, è necessario ricreare un nuovo oggetto NSPersistentStore, probabilmente rendendo puntare allo stesso file (definito dal l'argomento url a initWithPersistentStoreCoordinator:configurationName:URL:options:).

Quindi, come si fa a impostare la variabile storeURL?

Per salvare il contesto oggetto gestito, utilizzare NSManagedObjectContext di "Save:" Metodo dopo l'aggiunta di un nuovo archivio permanente e prima di chiudere l'applicazione. Poi, per verificare se sono stati aggiunti i negozi persistenti correttamente, utilizzare NSPersistentStoreCoordinator "persistentStores" metodo per determinare i negozi validi disponibili.

Mi chiedo se il problema non è il Data Nucleo chiamate così tanto come se / quando vengono chiamati?

Quando si "chiude l'applicazione e iniziare di nuovo" ... è l'applicazione terminato in mezzo, o è backgrounded? IIRC che si sottilmente influenzare ciò che viene chiamato nel vostro App Delegato. A seconda di come le cose sono disposte ci WRT Core Data, forse qualcosa viene accidentalmente chiamato (o perdere).

Mi sarebbe interessato a vedere che cosa succede se si traccia attraverso ogni singolo solitario relativo metodo Core Data in App Delegato (o ovunque si trovino), per vedere se si può prendere più rosso-handedly. (Se v'è un banco di prova minimo postato da qualche parte, si prega di condividere!)

Date un'occhiata a l'applicazione Window-based nei modelli Xcode.

Questo crea un intero stack core-Data per te -. Archivio permanente, persistente coordinatore del negozio, e il contesto oggetto gestito

Supponendo che l'applicazione non prevede esplicitamente che esso, si dovrebbe avere solo un archivio permanente. Questo è, in effetti, il file che i dati vengono scritti. Guardando il codice, sembra che stai cercando di creare il proprio negozio ogni volta che si salvare i dati.

È necessario copiare i metodi di base dello stack di dati dal modello ho suggerito sopra. Non è necessario fare riferimento al negozio persistente o persistente coordinatore del negozio da soli. Tutto ciò che serve è il contesto oggetto gestito creato dal delegato app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top