2009-12-02 23 views
7

sto inizializzazione di una sottoclasse NSManagedObject utilizzando:sottoclassi NSManagedObject e setValuesForKeysWithDictionary:

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues 

Sono anche consapevolmente dandogli la chiavi indefiniti, che naturalmente dovrebbe un'eccezione.

Così, ho implementato:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 

Se un tasto non è definito, traccio alla chiave corretta.

Tuttavia, la mia implementazione non viene mai chiamata, viene invece utilizzata l'implementazione NSManagedObject, che a sua volta rappresenta ancora un'eccezione..

Esiste un comportamento (o un bug) che impedisce a setValuesForKeysWithDictionary: di utilizzare un'implementazione di sottoclasse NSManagedObject di setValue:forUndefinedKey:?

Aggiunta di codice come richiesto, ma dal momento che io sono solo l'attuazione di un metodo esistente, che non venga chiamato, non so quanto aiuto sarà:

Nel contesto:

- (Company*)companyWithDictionary:(NSDictionary*)values{ 

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self]; 

    [newCompany setValuesForKeysWithDictionary:values]; 

    return newCompany; 
} 

Nel Company sottoclasse (mai chiamato):

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ 

    if([key isEqualToString:idKey]){ 

     [self setValue:value forKey:@"uniqueID"]; 

    }else if([key isEqualToString:descriptionKey]){ 

     [self setValue:value forKey:@"descriptionText"]; 

    }else if([key isEqualToString:timeUpdatedKey]){ 

     [self setValue:value forKey:@"dateUpdated"]; 

    }else{ 

     [super setValue:value forUndefinedKey:key]; 

    } 
} 

risposta

3

C'è sicuramente nulla di intrinseco al NSManagedObject che impedisce questo; Sto facendo esattamente questo nell'app a cui sto lavorando. Puoi pubblicare altro codice?

Un pensiero, anche: sei sicuro che sia setValue:forUndefinedKey: che sta lanciando l'eccezione? Per un oggetto gestito, sono abbastanza sicuro che è necessario implementare anche valueForUndefinedKey: (il getter) per far funzionare le cose correttamente.

+0

Sì, lo vedo nella traccia dello stack. Ed è anche l'implementazione di NSManagedObject. –

+0

Non ho implementato valueForUndefinedKey :. Ci proverò, ma non vedo perché ciò sarebbe dovuto al setter di Whack. –

+0

Aggiunto un po 'di codice ... –

2

Domanda semplice, ma stai specificando il nome della classe della sottoclasse NSManagedObject per l'entità nel modello?

Inoltre, hai detto che stai inizializzando l'oggetto gestito ... come? Dovresti inserirla tramite + [NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:] nella maggior parte dei casi, a meno che tu non abbia una buona ragione per non farlo.

+0

Sì e Sì. Ho anche ricreato le mie classi modello per essere sicuro. Ho anche provato a implementare valueFOrUndefinedKey nella classe del modello AND come categoria. –

+0

Questo è davvero strano. Puoi riprodurlo in un caso di test ridotto? Ho fatto cose simili ma non ho mai avuto questo problema. –

1

Un rapido dump di classe del framework CoreData indica chesostituisce anche setValuesForKeysWithDictionary:, quindi sembra che stia facendo qualche personalizzazione per quel metodo, forse per motivi di prestazioni o qualcosa del genere. Probabilmente scriverei semplicemente il mio metodo equivalente a setValuesForKeysWithDictionary: e chiamarlo per evitare l'intero casino. Qualcosa di simile:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict 
{ 
    for (NSString* key in dict) 
     [self setValue:[dict objectForKey:key] forKey:key]; 
} 
+0

questo è essenzialmente quello che ho fatto, ma tenendo conto dei valori NSNull. Anche dopo aver implementato la soluzione di Sixten, c'è stato un altro strano errore, quindi ho gettato la spugna. –

Problemi correlati