una tipos tipo tabla relaciones que procedimientos para los llena llave escriba como claves clave campo asignar ios database primary-key realm

ios - tipos - tipo de clave principal



¿Debo definir la clave principal para cada entidad en Realm? (2)

He notado que la configuración de PK no es obligatoria en Realm y simplemente se puede omitir. Pero en la documentación se afirma que:

Los índices se crean automáticamente para las propiedades de la clave principal.

Y me gustaría aclarar algunas preguntas:

1) ¿Cuál es el valor predeterminado para PK lo define Realm, si no lo asigno yo mismo? ¿Es hash o lo que sea? (Si no configuro PK y llamo [MyRealmObject primaryKey] , devuelve nil )

2) ¿Si esta PK implícita está indexada por defecto? ¿Debería preocuparme por eso, porque si no está indexado, significa que afecta el rendimiento general de esta Entidad (por ejemplo, recuperar objetos)?

3) ¿Es una buena práctica definir PK cada vez que se RLMObject para cada subclase RLMObject o no es necesario para Realm y simplemente puede confiar en su realización interna definida por Realm?


El caballo ya ha sido golpeado hasta la muerte, pero no pude evitar hacer referencia al código de Reino que arroja una excepción si se crea o actualiza un Objeto de Reino sin tener una clave principal.

+ (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value { // verify primary key RLMObjectSchema *schema = [self sharedSchema]; if (!schema.primaryKeyProperty) { NSString *reason = [NSString stringWithFormat:@"''%@'' does not have a primary key and can not be updated", schema.className]; @throw [NSException exceptionWithName:@"RLMExecption" reason:reason userInfo:nil]; } return (RLMObject *)RLMCreateObjectInRealmWithValue(realm, [self className], value, true); }


(Descargo de responsabilidad: trabajo para Realm.)

¡Sí! Establecer una clave principal en Realm no es obligatorio ni necesario, por lo que depende completamente del desarrollador y de los requisitos de la aplicación determinar si es necesario o no en su implementación.

En respuesta a sus preguntas:

1) No hay valores por defecto; especifica una de sus propias propiedades como clave principal. primaryKey devuelve nil de forma predeterminada, ya que debe anularlo usted mismo para indicar a Realm qué propiedad desea que actúe como clave principal. Algunos usuarios han establecido números enteros como claves primarias, pero la mayoría de las veces, usar una cadena UUID es lo más común.

2) No hay una clave primaria implícita. Debe usar el [RLMObject primaryKey] para indicar explícitamente qué propiedad es la clave principal, y ENTONCES se indexará. :)

3) En mi propia experiencia de desarrollo (de tiempo libre), generalmente me parece que tener una clave principal hace que sea mucho más fácil identificar y manejar objetos específicos. Por ejemplo, si está pasando un objeto a través de subprocesos, simplemente puede pasar el valor de la clave principal y usar [RLMObject objectForPrimaryKey:] para recuperar el objeto. Obviamente esto depende de sus propios requisitos de implementación. Probablemente no debería agregar una clave principal a menos que descubra que realmente necesita una.

A modo de ejemplo, esto es lo que agregaría a su subclase RLMObject si quisiera establecer una cadena UUID como clave principal:

@interface MyObject : RLMObject @property NSString *uuid; @end @implementation MyObject + (NSString *)primaryKey { return @"uuid"; } + (NSDictionary *)defaultPropertyValues { @{@"uuid": [[NSUUID UUID] UUIDString]}; } @end

Espero que haya ayudado!

Anexo: Para desarrollar algunos de los comentarios que se hacen a continuación, las claves primarias son explícitamente necesarias para cualquier API de Realm que cambie su funcionalidad dependiendo de si ya existe un objeto con la misma clave en la base de datos. Por ejemplo, +[RLMObject createOrUpdateInRealm:] agregará un nuevo objeto Realm a la base de datos si un objeto con esa clave principal ya no existe, y simplemente actualizará el objeto existente de lo contrario.

Como tal, en estos casos donde una clave principal es un componente crítico de la lógica subsiguiente, se requieren. Sin embargo, dado que estas API son un subconjunto de las diferentes formas en que es posible agregar / actualizar datos en Realm, si elige no usarlos, no es necesario que tenga una clave principal.