2012-07-08 16 views
15

ho un modello di dati per gare di Formula 1, con 3 soggetti:astratte entità e l'eredità di Core Data

  • RacingActor: un'entità astratta
  • Pilot: eredita da RacingActor
  • della squadra: eredita da RacingActor

enter image description here

Se genero NSManagedObject sottoclassi per rappresentare queste entità, il codice generato non rappresenta affatto questo disegno:

  • Tutto eredita da NSManagedObject
  • Niente mi impedisce di istanziare RacingActor
  • La proprietà team Pilot è di tipo NSManagedObject invece di Team

È questo il comportamento previsto? Dovrei risolvere il codice generato da Xcode? Mi sto perdendo qualcosa?

BTW, sto usando Xcode 4.3.3

+0

[Questo] (http://stackoverflow.com/a/6920736/832111) risposta mi fa credere che l'entità entità/entità astratte non è la scelta giusta per questo. –

risposta

10

Core Data al centro è una libreria di mapping relazionale oggetti. Molto tempo fa si chiamava Entreprise Object Framework, parte di WebObjects.

Quindi sì, l'oggetto di base per qualsiasi oggetto persistente gestito da Core Data è NSManagedObject e puoi fare quello che vuoi con loro.

Nell'esempio, Team e Pilot condivideranno una tabella comune e sarete in grado di utilizzare le query per recuperare Team e Pilot contemporaneamente. Questa è l'idea.

L'albero di ereditarietà Objective-C (se si utilizzano classi personalizzate) può rispecchiare il modello definito, ma non è necessario. È possibile creare una classe personalizzata RacingActor, utilizzarla come classe base per le classi personalizzate Team e Pilot oppure è possibile indicare al modello di utilizzare RacingActor per gli oggetti Team e Pilot. È anche possibile definire una classe base completamente indipendente (purché NSManagedObject sia un genitore, direttamente o indirettamente) per Team e/o Pilot se lo si desidera.

Si è quindi liberi di implementare i comportamenti specifici necessari nella propria business logic, sia in controller che in classi di dati personalizzate.

+5

Suggerirei di non eseguire l'ereditarietà nei dati principali a meno che il set di dati non sia molto piccolo. Le prestazioni si degradano molto rapidamente con l'ereditarietà. Vedi http://stackoverflow.com/questions/5276369/prevent-core-data-from-combining-entities-into-one-table?lq=1 e http://stackoverflow.com/questions/6917494/core-data -Performance-con-monoparentale-entità? lq = 1. – jjxtra