Domanda

Questa domanda è probabilmente un lungo tiro. Io non riesco a capire gli errori che sto ottenendo sul mio progetto di dati di base quando salvo dopo cancello un'entità.

Ho due entità principali con cui lavoro, un abito, e un articolo. Posso crearli senza alcun problema, ma quando li cancello ottengo il log degli errori segue:

Per l'Outfit:

2009-09-22 20:17:37.771 itryiton[29027:20b] Operation could not be completed. (Cocoa error 1600.)
2009-09-22 20:17:37.773 itryiton[29027:20b]   {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = outfitArticleViewProperties;
    NSValidationErrorObject = <Article: 0x12aa3c0> (entity: Article; id: 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1> ; data: {
    articleID = 2009-09-22 19:05:19 -0400;
    articleImage = 0x12b4de0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 19:05:19 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue =     {(
        <OutfitArticleViewProperties: 0x1215340> (entity: OutfitArticleViewProperties; id: 0x12b50f0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/OutfitArticleViewProperties/p1> ; data: {
    article = 0x12b49a0 <x-coredata://7046DA47-FCE1-4E21-8D7B-E532AAC0CC46/Article/p1>;
    articleViewPropertiesID = nil;
    outfit = nil;
    touch = nil;
    view = "(...not nil..)";
})
    )};
}

E se elimino un articolo ottengo:

2009-09-22 18:58:38.591 itryiton[28655:20b] Operation could not be completed. (Cocoa error 1560.)
2009-09-22 18:58:38.593 itryiton[28655:20b]   DetailedError: {
    NSLocalizedDescription = "Operation could not be completed. (Cocoa error 1600.)";
    NSValidationErrorKey = articleImage;
    NSValidationErrorObject = <Article: 0x12aa340> (entity: Article; id: 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1> ; data: {
    articleID = 2009-09-22 18:58:26 -0400;
    articleImage = 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1>;
    articleType = nil;
    attributeTitles = "(...not nil..)";
    color = nil;
    comment = nil;
    dateCreated = 2009-09-22 18:58:26 -0400;
    designer = nil;
    imageView = "(...not nil..)";
    location = "(...not nil..)";
    outfitArticleViewProperties =     (
        0x12b5010 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/OutfitArticleViewProperties/p1>
    );
    ownesOrWants = 0;
    pattern = nil;
    price = nil;
    retailer = nil;
    thumbnail = "(...not nil..)";
    washRequirements = nil;
    wearableSeasons = nil;
});
    NSValidationErrorValue = <ArticleImage: 0x12ad600> (entity: ArticleImage; id: 0x12b4d00 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/ArticleImage/p1> ; data: {
    article = 0x12b3f10 <x-coredata://05340FA6-B5DC-4646-A5B4-745C828C73C3/Article/p1>;
    image = "(...not nil..)";
});
}

Un errore 1600 è:

  

NSValidationRelationshipDeniedDeleteError
  Codice di errore per indicare qualche relazione
  con regola di eliminazione NSDeleteRuleDeny è
  non vuoto.

     

Disponibile in Mac OS X v10.4 e versioni successive.

     

dichiarata in CoreDataErrors.h.

Ma io non riesco a vedere per la vita di me, che rapporto sarebbe prevenire l'eliminazione. Se alcuni wizard Core Data può vedere l'errore dei miei modi, sarei umiliato.

Non riesco a segnare questo risolto, perché non ho davvero risolverlo, ma ho un lavoro work-around. Nel .m per ciascuno dei miei managedObjects ho aggiunto un metodo che appare come:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

Così si può vedere, per prima cosa NIL manualmente i rapporti, e poi ho l'oggetto stesso eliminare. In altri oggetti, invece di nil-ing, il mio metodo di eliminazione viene chiamato su alcune delle relazioni oggetti, per ottenere una cascata.

È stato utile?

Soluzione 3

Non riesco a segnare questo risolto, perché non ho davvero risolverlo, ma ho un lavoro work-around. Nel .m per ciascuno dei miei managedObjects ho aggiunto un metodo che appare come:

-(void) deleteFromManangedObjectContext{ 
   self.outfit = nil; 
   self.article = nil; 
   [[self managedObjectContext] deleteObject:self]; 
} 

Così si può vedere, per prima cosa NIL manualmente i rapporti, e poi ho l'oggetto stesso eliminare. In altri oggetti, invece pari a zero-ing, il mio metodo di eliminazione viene chiamato su alcune delle relazioni oggetti, per ottenere una cascata.

Sono ancora interessato alla risposta "giusta". Ma questa è la soluzione migliore che ho, e ammette la presenza di controllo capillare su come i miei rapporti vengono eliminati.

Altri suggerimenti

Ho appena avuto il problema della eliminazione falliscono, ed è atterrato su questa questione. E ho capito il mio problema e ho pensato che mi piacerebbe condividere anche questo e forse qualcuno avrà lo stesso problema pure.

L'errore che ho fatto è che l'oggetto (A) Sto cercando di eliminare avere una relazione con un altro oggetto (B) con NULL regola come cancellazione. Tuttavia, l'oggetto B hanno anche un rapporto con A ed è non-optional. Perciò, quando elimino un rapporto di B di A diventa nulla che non è consentito. Quando cambio la regola di eliminazione a cascata e ha funzionato.

Ti capita di attuare alcune delle funzione di accesso al rapporto te stesso? Una volta ho avuto un codice come

-(NSSet*)articles
{
       re-calculates properties....
       return [self primitiveValueForKey:@"articles"];
}

in una sottoclasse di NSManagedObject e aveva un errore di salvataggio. Quello che è successo è che, quando questo oggetto viene eliminato dal ManagedObjectContext, il CoreData chiama la funzione di accesso "articoli" per affrontare con la propagazione di eliminazione. Questo ricalcolo di articoli si è verificato durante la propagazione di eliminazione, che ri-surrected gli "articoli" nulle nel mio caso.

Controlla il file xcdatamodel per un Deny eliminare regola. Clicca su ogni rapporto fino a trovarlo. Avrai bisogno di cambiare questa regola o regolare come si eliminano gli oggetti gestiti per anticipare l'applicazione della regola del rapporto.

Ho avuto un problema simile in cui si è scoperto che il problema era nel file .xib. Quando ho acceso la casella di controllo "elimina gli oggetti su Rimuovi" (sotto Bindings-> Contenuto Set) del relativo controller di array, il problema è andato via.

Non so se questo aiuterà nel tuo caso, ma ho avuto un sacco di peli andare grigio sopra i problemi che si rivelò essere nascosto da qualche parte all'interno di Interface Builder.

Nel mio caso ho innocentemente creato metodo personalizzato nel mio sottoclasse di NSManagedObject: isDeleted. Stavo incontrando strano salvare eccezioni fino a quando ho rimosso / rinominato. Dopo aver perso la mia sanità mentale, ho letto la documentazione ancora più attraverso-pienamente questa volta. Si è scoperto ho sovrascritto uno dei metodi NSManagedObject non si deve eseguire l'override.

Controlla se questo estratto da documenti consente di:

  

Metodi non devi override

     

NSManagedObject si personalizza molte caratteristiche di NSObject in modo che   oggetti gestiti possono essere adeguatamente integrati nel core dei dati   infrastruttura. Core Data si basa sulla realizzazione di NSManagedObject   dei seguenti metodi, che quindi assolutamente non deve   ignorare: primitiveValueForKey :, setPrimitiveValue: Forkey :,   IsEqual :, hash, superclasse, di classe, di sé, isProxy, isKindOfClass :,   isMemberOfClass :, conformsToProtocol :, respondsToSelector :,   managedObjectContext, entità, objectID, isInserted, isUpdated,    isDeleted , e isFault, alloc, allocWithZone :, nuovo, instancesRespondToSelector :, instanceMethodForSelector :,   methodForSelector :, methodSignatureForSelector :,   instanceMethodSignatureForSelector :, o isSubclassOfClass:.

Inoltre - ci sono altri metodi si può ignorare, ma è necessario chiamare super-implementazione come o chiama il numero: willAccessPrimitiveForKey, didAccessPrimitiveForKey in di accesso e willChangevalueForKey, didChangeValueForKey in setter ....

Recentemente ho incontrato questo errore perché avevo codice nella - (void) metodo willSave che ha aggiornato alcune delle proprietà dell'oggetto gestito eliminazione dopo -. (BOOL) isDeleted già restituito true

ho riparato da:

- (void)willSave {
    if (![self isDeleted]) {
    //Do stuff...
    }
}

Stavo incontrando un problema molto simile con le eliminazioni a cascata, sulle relazioni genitore-figlio non opzionali. E 'stato molto confusa perché ho pensato che il rapporto genitore eliminare regola è stata impostata a cascata. Si scopre che l'editor modello di dati in Xcode non stava salvando la regola di eliminazione. Vorrei impostarlo a cascata, andare in un punto di vista diverso e tornare e sarebbe impostato per annullare di nuovo. Ho dovuto riavviare Xcode e impostare la regola di eliminazione a cascata. Dopo che ho fatto questo tutto ha funzionato.

Quindi, se qualcun altro si verifica questo problema doppio controllo che Xcode è salvare le vostre regole di eliminazione prima di scavare in soluzioni più complesse.

Tra l'altro sto usando dati fondamentali su iOS con Xcode 5 dell'editor modello di dati.

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