2009-10-16 10 views
6

Ho creato un modello Core Data in cui ho due oggetti, ad esempio Persona e Indirizzo. Una persona ha un indirizzo e un indirizzo può appartenere a molte persone. L'ho modellato nei dati di base come tali (quindi la doppia freccia punta a Persona, mentre la singola freccia va a Indirizzo)I dati principali restituiscono NSManagedObject anziché la classe Concrete, ma solo durante l'utilizzo. accessor

Ho quindi creato due classi per tali oggetti e implementato alcuni metodi personalizzati in quelle classi. Nel modello Core Data ho inserito i nomi delle classi in essi.

Se recupero direttamente un indirizzo da Core Data, mi dà l'effettiva classe concreta e posso richiamare i miei metodi personalizzati su di esso.

Se invece prelevo una Persona e provo ad accedere all'Indirizzo tramite Persona (es .: person.address) Ricevo un NSManagedObject che è un indirizzo (es: posso accedere a tutti gli attributi dei dati di base I impostato su di esso) ma non risponde ai miei metodi personalizzati, perché è di tipo NSManagedObject anziché Address. Si tratta di una limitazione di Core Data o sto facendo qualcosa di sbagliato? Se si tratta di una limitazione, c'è qualche problema?

+0

Non è una limitazione dei dati principali; stai certamente facendo qualcosa di sbagliato. Cosa intendi esattamente per "non risponde ai miei metodi personalizzati, perché è di tipo NSManagedObject invece di Address"? Riceverete un selettore non riconosciuto come eccezione? Il compilatore si lamenta? Mostraci del codice e l'output o sarà difficile diagnosticare il problema. –

+0

Quindi si tratta di un errore di runtime (non di un compilatore), su NSManagedObject che non risponde al nome del mio metodo personalizzato. Lo stesso errore che si ottiene quando non si specifica il nome della classe nel modellatore dati principale. – rustyshelf

risposta

9

Hai creato quelle classi utilizzando il modellatore (Seleziona un'entità, File> nuovo file .., Classe oggetto gestito, quindi seleziona l'entità modello)?

Qualche tempo fa ho avuto un problema simile perché non ho creato i miei modelli oggetto gestiti utilizzando il Modeller. Quello che ho fatto per assicurarmi che tutto fosse funzionante è stato quello di copiare e salvare i miei metodi personalizzati (e tutto il resto che avevo implementato) e ricominciare da zero usando il modellatore. Poi sono stato in grado di personalizzare nuovamente le mie classi di modelli e tutto ha funzionato bene.

So che questa non è una risposta completa, ma forse può aiutarti finché qualcuno non spiega esattamente cosa sta succedendo.

Cheers!

+0

Grazie per il suggerimento, l'ho provato su un'unica entità, ma lo farò a tutti e vedrò se fa alcuna differenza – rustyshelf

+0

Ha funzionato! Li ho ricreati tutti dal modello, ho aggiunto il mio codice personalizzato e BAM è stato felice. Strano.Non riesco a vedere alcuna differenza evidente a parte i metodi extra che ha generato che non avevo ... – rustyshelf

6

Probabilmente hai semplicemente dimenticato di impostare il nome della classe nel modello quando hai creato l'entità - per impostazione predefinita NSManagedObject. Fare clic su Persona e Indirizzo nel modellatore e controllare, nell'estrema destra in cui sono elencate le proprietà delle entità, che il campo Classe è compilato correttamente con il nome della classe obiettivo C corrispondente e non è solo l'impostazione predefinita NSManagedObject.

+0

No, ho sicuramente impostato tutti quelli, quindi perché funziona se richiamo un oggetto di quel tipo direttamente dai dati principali – rustyshelf

+0

In realtà, il recupero di un oggetto funzionerà indipendentemente dal fatto che la classe dell'entità sia impostata su NSManagerObject o meno. Ma, come sottolinea @Terry Longrie, per chiamare i metodi personalizzati di un oggetto gestito, la classe dell'entità deve essere esplicitamente impostata su Persona o Indirizzo o altro. Quando crei la classe personalizzata usando il modellatore come suggerito da @Lio, questo viene fatto automaticamente per te. Quando si crea la classe personalizzata a mano, per così dire, è necessario specificare la classe anche a mano. Ho sprecato alcune ore della mia vita a capirlo. –

1

Probabilmente il file di implementazione per la classe non è stato aggiunto alla destinazione in esecuzione.

(Ottieni informazioni sul file .m -> Selezionare la scheda target)

Se il xcdatamodel ha il set di classe, se non lo trova in fase di esecuzione che continuerà a funzionare, sarà solo ottenere Invece, le istanze di NSManagedObject. Che funzionerà davvero bene, finché non proverai ad aggiungere un altro metodo alla classe, come hai trovato.

+0

Questo era il problema nel mio caso – Jan

Problemi correlati