Devrais-je définir la key primaire pour chaque entité dans Realm?

J'ai remarqué que mettre PK n'est pas obligatoire dans le Royaume et peut simplement être omis. Mais dans la documentation est indiqué que:

Les index sont créés automatiquement pour les propriétés de key primaire.

Et j'aimerais clarifier certaines questions:

1) Quelle est la valeur par défaut pour PK est défini par Realm, si je ne l'atsortingbue pas par moi-même. Est-ce le hachage ou quoi que ce soit? (Si je ne mets pas PK et n'appelle pas [MyRealmObject primaryKey] il returnne nil )

2) Si ce PK implicite est indexé par défaut? Devrais-je m'inquiéter à ce sujet, parce que si elle n'est pas indexée, cela signifie-t-il qu'elle affecte les performances générales de cette entité (par exemple, récupérer des objects)?

3) Est-ce une bonne pratique de définir chaque fois PK pour chaque sous-class RLMObject ou n'est pas nécessaire pour Realm et peut simplement s'appuyer sur sa réalisation interne définie par Realm lui-même?

(Disclaimer: Je travaille pour le Royaume.)

Oui! Définir une key primaire dans Realm n'est pas obligatoire, ni nécessaire, c'est pourquoi c'est entièrement au développeur et aux exigences de l'application de déterminer si c'est nécessaire ou non dans leur implémentation.

En réponse à vos questions:

1) Il n'y a pas de valeurs par défaut; vous spécifiez l'une de vos propres propriétés en tant que key primaire. primaryKey renvoie zéro par défaut car vous devez le replace vous-même afin d'indiquer à Realm la propriété que vous voulez utiliser en tant que key primaire. Certains users ont défini des entiers en tant que keys primaires, mais le plus souvent, l'utilisation d'une string UUID est la plus courante.

2) Il n'y a pas de key primaire implicite. Vous devez utiliser la [RLMObject primaryKey] pour indiquer explicitement quelle propriété est la key primaire et ALORS elle sera indexée. 🙂

3) Dans ma propre expérience de développement (time libre), je trouve habituellement qu'une key primaire facilite beaucoup l'identification et la manipulation d'objects spécifiques. Par exemple, si vous passez un object à travers les threads, vous pouvez simplement passer la valeur de la key primaire et utiliser [RLMObject objectForPrimaryKey:] pour réapprovisionner l'object. Évidemment, cela dépend de vos propres exigences de mise en œuvre. Vous ne devriez probablement pas append de key primaire à less que vous ne trouviez que vous en avez vraiment besoin.

Par exemple, voici ce que vous appendiez à votre sous-class RLMObject si vous vouliez définir une string UUID en tant que key primaire:

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

J'espère que cela a aidé!

Addendum: Pour développer certains des commentaires ci-dessous, les keys primaires sont explicitement nécessaires pour les API Realm qui changent leur fonctionnalité selon si un object avec la même key existe déjà dans la database. Par exemple +[RLMObject createOrUpdateInRealm:] appenda un nouvel object Realm à la database si un object avec cette key primaire n'existe pas déjà, et mettra simplement à jour l'object existant dans le cas contraire.

En tant que tel, dans ces cas où une key primaire est une composante critique de la logique suivante, ils sont requirejs. Toutefois, étant donné que ces API constituent un sous-set des différentes manières d'append / mettre à jour des données dans Realm, si vous choisissez de ne pas les utiliser, vous n'avez toujours pas besoin d'une key primaire.

Le cheval a déjà été battu à mort, mais je n'ai pu m'empêcher de faire reference au code du Royaume qui lance une exception si un object Realm est créé ou mis à jour sans avoir de key primaire.

 + (instancetype)createOrUpdateInRealm:(RLMRealm *)realm withValue:(id)value { // verify primary key RLMObjectSchema *schema = [self sharedSchema]; if (!schema.primaryKeyProperty) { NSSsortingng *reason = [NSSsortingng ssortingngWithFormat:@"'%@' 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); }