Hola En mi aplicación Core Data model tengo entidades de hoja y texto. La entidad de hoja puede tener dos textos: privacyNotes y termsOfUse. Ambos de tipo de texto. Así que en el modelador de datos XCode creo relaciones one-to-name llamadas "privacyNotes" y "termsOfUse" en Sheet with Text destination. A continuación, aparece una "hoja" de relación en Texto. Luego selecciono esa relación Text.sheet como inversa para Sheet.privacyNotes. Hasta aquí todo bien. Pero cuando establezco la misma relación Text.sheet como inversa para Sheet.termOfUse, XCode elimina esta relación como Sheet.privacyNotes inversa. Entiendo que las relaciones en DB pueden no ser tan simples en comparación con las relaciones de objetos Objective-C, pero realmente no entiendo por qué SQLite o (CoreData) no pueden reutilizar una relación como inversa para POCAS relaciones.Datos principales: relación inversa para dos relaciones con el mismo tipo
Respuesta
Una pequeña ojeada debajo de la capucha de la abstracción puede ser esclarecedora *: una relación solo puede ser inversa para exactamente otra relación porque, en la tienda de respaldo, están representadas por los mismos datos. Si un Texto y una Hoja pueden tener cierta relación, Core Data hace lo que un buen modelador humano de datos haría y almacena esa relación lo más brevemente posible. Las propiedades de relación de los objetos de entidad son solo formas de ver esa relación.
Para obtener el efecto de lo que está buscando: siga adelante y proporcione propiedades de hoja para privacidadNota y termsOfUse; pero proporcione propiedades de texto como sheetIAmTermsFor y sheetIAmPrivacyNoteFor, y configúrelas como inversas de forma adecuada. Luego, en la clase de texto, añadir una propiedad sintética a lo largo de estas líneas:
// in interface
@property (nonatomic, readonly) Sheet *sheet;
// in impl
-(Sheet *)sheet
{
if ([self sheetIAmTermsFor])
return [self sheetIAmTermsFor];
else
return [self sheetIAmPrivacyNoteFor];
}
Si desea escribir un regulador también, que tendrá que decidir qué papel que colocador debe conferir al texto (que puede Core Data 't averiguar por ti, otra de las razones de una propiedad no puede ser la inversa de dos propiedades diferentes.)
Si necesidad de imponer una restricción de que un texto sólo puede ser nunca una 'privacyNote' o un " los términos "pero nunca ambos", anulan los setters para sheetIAmTermsFor y sheetIAmPrivacyNoteFor, siguiendo el patrón de Apple en los documentos, y tienen cada uno nulo la otra propiedad cuando se establece.
(* Apple considera que las bases de datos SQLite Core Data generan privacidad para su implementación, pero inspeccionar sus esquemas puede ser muy educativo. Simplemente no tengas la tentación de escribir código de envío que vaya detrás del CD para tocar el db directamente .)
Es mucho mejor tener una relación uno a muchos entre Hoja y Texto con un límite de validación de 2. Entonces debe tener una propiedad de tipo en el texto que lo declare como privacyNotes
o termsOfUse
. Desde allí, puede agregar métodos de conveniencia a su subclase Hoja que le permite recuperar cualquiera de ellos.
- 1. Datos principales: ¿una relación inversa con entidades múltiples?
- 2. Relaciones múltiples de datos principales a la misma entidad
- 3. Relación inversa de datos centrales no establecida
- 4. Interfaz genérica con relación inversa
- 5. Datos principales - NSPredicar para filtrar la relación de muchos
- 6. Clases de relación múltiple con el mismo tipo
- 7. Datos principales: evitando retener ciclos en muchas relaciones
- 8. Entidad principal y relación en los datos principales
- 9. Datos básicos NSPredicar para relaciones
- 10. Datos principales: clasificación por conteo en una relación a muchos
- 11. InvalidCastException para dos Objetos del mismo tipo
- 12. Unity: registrando el mismo tipo para dos interfaces
- 13. Datos principales: Resultado de obtención de múltiples entidades o relación
- 14. Buscar datos principales para todos los objetos con una relación "muchos" vacía
- 15. dos parámetros de tipo con el mismo nombre
- 16. Andamio ActiveRecord: dos columnas del mismo tipo de datos
- 17. ¿Cómo configurar correctamente una NSPredicate para una relación de muchos cuando se utilizan datos principales?
- 18. Datos principales: Error "No se pueden combinar modelos con dos entidades diferentes con el nombre 'foo'"
- 19. inversa relación con múltiples clases Herencia de Django en
- 20. Datos principales con almacenamiento en memoria
- 21. Dos variables con el mismo nombre y tipo, en dos archivos .c diferentes, compilar con gcc
- 22. Rieles ActiveRecord crea una clave externa incorrecta si hay dos relaciones belongs_to con el mismo modelo
- 23. Django agregación entre la relación inversa
- 24. Dos clases tienen el mismo nombre de tipo XML "objectFactory"
- 25. Problema de relación uno a varios de CoreData e inversa
- 26. Will dlopen ceder el mismo identificador para dos llamadas con el mismo archivo?
- 27. (De) Normalización de dos relaciones
- 28. Constructores con el mismo tipo de argumento
- 29. Dos clases tienen el mismo nombre de tipo xml
- 30. 'Muchos a dos' relación
Sí, pero los métodos de conveniencia de la hoja tendrían que probar las dos entidades de texto para su tipo, lo que parece un poco desperdiciado. Sería mejor si [ya] hubiésemos ordenado relaciones, para que pudieras decidir poner siempre 'privacyNote' primero. –
Me encontré con un problema de diseño similar. La idea de almacenar un tipo es exactamente lo que necesitaba. – Brian