2013-01-13 13 views
9

creo un oggetto categoria e salvarlo:Impossibile aggiornare oggetto che non è mai stato inserito

NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext]; 

    _category = (Category *)[NSEntityDescription 
          insertNewObjectForEntityForName:@"Category" 
          inManagedObjectContext:managedObjectContext]; 

    NSError *error = nil; 
    [managedObjectContext save:&error]; 
    if (error) { 
     NSLog(@"error saving: %@",error); 
    } 

quindi modificare il nome dell'oggetto categoria e salvare di nuovo.

_category.name = _nameTextField.text; 

    NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext]; 

    NSError *error = nil; 
    [managedObjectContext save:&error]; 
    if (error) { 
     NSLog(@"error saving: %@",error); 
    } 

e ottenere questo errore:

2013-01-12 17:53:11.862 instacat[7000:907] Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x2027b300 {NSAffectedObjectsErrorKey=(
"<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-coredata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n categoryId = nil;\n isPrivate = 0;\n name = techies;\n users =  (\n );\n})" 
), NSUnderlyingException=Cannot update object that was never inserted.}, { 
    NSAffectedObjectsErrorKey =  (
     "<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-coredata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n categoryId = nil;\n isPrivate = 0;\n name = techies;\n users =  (\n );\n})" 
    ); 
    NSUnderlyingException = "Cannot update object that was never inserted."; 
} 

Grazie per il vostro tempo e considerazione.

Sto utilizzando AFIncrementalStore.

+0

Sembra che al primo momento quando si inserisce l'oggetto, non si stia inserendo nel database. Prova a mettere una stringa fittizia e poi aggiornala e spero che risolva il tuo problema. – iCreative

+1

"' _category' "si sente come la parte grezza di una proprietà. Se si tratta di una proprietà, cosa succede quando si utilizza "' self.category' "? –

+0

Sei sicuro che sia lo stesso oggetto gestito? L'ID oggetto (l'URL 'x-coredata') ha l'aspetto di un ID oggetto temporaneo. Il 't' è un omaggio. –

risposta

1

Quando si aggiorna un oggetto, non è possibile utilizzare insertNewObjectForEntityForName, è necessario salvare prima l'oggetto, quindi chiamare qualcosa come

[self.managedObjectContext refreshObject:_category mergeChanges:YES] 

Quindi utilizzare managedObjectContext salvare di nuovo.

Questa è la differenza in SQL diretto come "INSERT" e "UPDATE".

+0

Questo non ha molto senso.Il ManagedObjectContext è come una sessione in un database ed è possibile eseguire un inserimento e un aggiornamento prima di un commit corrispondente in SQL per un aggiornamento. –

+0

Non sapendo cosa dire, è necessario chiamare refreshObject, che risolverà questo problema. È in linea con l'errore –

0

Quello che penso stia accadendo è che non si sta ottenendo il giusto NSManagedObjectContext.

Pensateci come una sessione. Quindi quando aggiorni non stai ottenendo la sessione giusta e quindi il tuo oggetto non esiste lì.

Prima di eseguire il secondo salvataggio, provare a trovare il proprio oggetto su NSManagedObjectContext. Se è necessario ulteriore aiuto, descrivere cosa succede tra la creazione e l'aggiornamento.

L'errato NSManagedObjectContext può essere dovuto a un codice errato su AppDelegate o all'accesso da un altro thread diverso dal thread principale.

4

Che ne dite di qualcosa di simile:

self.category.name = self.nameTextField.text; 

NSManagedObjectContext *managedObjectContext = [[FTAppDelegate sharedAppDelegate] managedObjectContext]; 

if(![self.category isInserted]) 
{ 
    [managedObjectContext insertObject:self.category]; 
} 

NSError *error = nil; 
[managedObjectContext save:&error]; 
if (error) { 
    NSLog(@"error saving: %@",error); 
} 

controllare In sostanza l'oggetto è vero è stato inserito prima, se non, inserirla e quindi salvare il contesto.

+0

Questo sembra il più corretto, in quanto è necessario utilizzare insertObject: nel MOC con l'oggetto appena creato. – h4xnoodle

+0

@h4xnoodle: [NSEntityDescription insertNewObjectForEntityForName: ... inManagedObjectContext: ...] inserisce insertObject sul contesto, quindi non è necessario chiamarlo manualmente. – JakubKnejzlik

1

L'oggetto sta perdendo il ManagedObjectContext. O utilizzare

self.managedObjectContext 

o recupera nuovamente l'oggetto in

[[FTAppDelegate sharedAppDelegate] managedObjectContext] 

e modificare l'oggetto refetched e quindi salvarlo.

+0

Puoi fornire maggiori dettagli sul perché questo aiuta? O dove si potrebbe sbagliare in primo luogo? – tslater

1

Ho lo stesso errore ma scenario diverso e raro, succede una volta in quasi 100 tentativi. Trova il mio problema di seguito:

Ho 2 NSManagedObjects nel modello di dati di base: 1- 2- piombo LeadAttirbute piombo ha rapporto 1-M con LeadAttribute.

C'è un modulo che immette per lead e aggiorna (crea nuovo lead) il modulo dopo aver inviato un lead.Se continuo a inviare i lead in una fase, [saveObjectContext save: & error]; "L'operazione non può essere completata (errore di cacao 134030.)": inizia a dare sotto l'errore

Domain = Codice NSCocoaErrorDomain = 134.030 UserInfo = {0x1f251740 NSAffectedObjectsErrorKey = ( "(entità: LeadInfoAttribute; id: 0x1f2eb920; i dati : {\ n attributeId = 0; \ n lead = nil; \ n opzionale = nil; \ n orderId = 0; \ n title = nil; \ n value = Bjjbjp; \ n}) " ), NSUnderlyingException = Impossibile aggiorna l'oggetto che non è mai stato inserito.}

E continua a dare lo stesso errore finché non ho terminato e riavviato l'app. Non sono in grado di aggiornare nulla nel modello dati principale dopo che si è verificato questo errore, quindi le mie domande sono:

1- È possibile rimuovere lo stato di errore dei dati di base? Per catturare ed eliminare l'oggetto che sta creando problemi prima di effettuare nuovamente la chiamata di salvataggio.

2- Quali potrebbero essere le possibili cause di questo problema? Dal momento che è molto raro e non può riprodurlo ogni volta.

+0

Sto vivendo lo stesso problema. Se trovi una soluzione, faccelo sapere. –

+0

Anche io ... Continueremo a cercare e pubblicare se trovo qualcosa. – tslater

0

Ho appena eseguito in questo problema e nel mio caso il problema stava seguendo:

  • 1) creare nuovo oggetto gestito nel contesto A
  • 2) salvare il contesto A
  • 3) recuperare questo oggetto da objectID dal contesto B
  • 4) apportare modifiche oggetto gestito e salvare il contesto B

Normalmente non sarebbe un probl em, ma in questo caso il contesto A è contesto figlio e quindi non salva in archivio persistente (solo per contesto padre, che non è il contesto B). Quindi quando il recupero per l'oggetto gestito viene eseguito dal contesto B, il contesto non ha questo oggetto. Quando vengono apportate modifiche, il contesto prova a salvarle comunque ... e questo è quando si verifica questo errore. In alcuni casi (come menzionato da @Trausti Thor) refreshObject: mergeChanges: il metodo potrebbe aiutare (passa i dati a un altro contesto).

Nel tuo caso Vado a controllare se:

1) gestito contesto dell'oggetto da [[FTAppDelegate sharedAppDelegate] managedObjectContext] restituisce sempre lo stesso contesto

2) quando si salva la categoria, verificare se è stato davvero salvato nel negozio persistente (self.category.objectID.isTemporaryID == NO)

NOTA: Il secondo punto è più importante, perché se si guarda attentamente, l'oggetto categoria ha ancora objectID temporaneo, il che significa che non è persisteva.

Problemi correlati