[Résolu] Realm et attribution de l'id

Bonjour à tous,

Je suis entrain de construire quelques objets, puis ensuite je vais me connecter à Realm via d’autres classes pour être indépendant.
Néanmoins, j’ai une question au sujet de l’id lors de la création d’un row dans Realm.
Est il plus pertinent de laisser Realm attribuer l’id ou bien d’en affecter un ?
Il s’agit d’un id technique qui a besoin d’être unique. Donc par défaut c’est mieux de le laisser attribuer à la BD, mais côté Realm je ne sais pas si il est content avec cela. J’imagine que oui, mais je préfère demander à qqn qui a déjà joué avec Realm :slight_smile:

Bonne journée à tous,

Sylvain

Hello,

Je me répond à moi même, peut être que cela profitera à d’autres.
Je ne savais pas que Swift permettait de récupérer un identifiant unique. Mais dès lors que oui, cela répond à la question. C’est à mon objet de déterminer son propre id unique via la fonction UUID(). et comme cela je continue d’être 100% autonome qqsoit le moteur de DB.

1 « J'aime »

Bonjour,
Je suis en train de me mettre à Realm, mais j’ai un peu de mal.
Pour l’id, ce que j’ai l’intention de faire c’est de déclarer un id:UUID = UUID() dans mes objets Swift, et quand je les copie dans Realm, comme Realm ne connait pas UUID, il faut convertir l’id de type UUID en string avec id.uuidString.
Pascal

Bonjour,
C’est exactement ce qu’il faut faire.
J’ai vu aussi que Realm n’a pas d’auto incrément ce qui était une autre possibilité. du coup pas le choix, c’est bien ainsi qu’il faut le faire.

Au cas ou, n’oublie pas dans tes objets Realm d’avoir une Primary key sur cet id. C’est nécessaire pour une gestion rigoureuse et de bonne perf. Tu peux aussi indexer certains attributs si tu request tout le temps dessus. Mais attention car cela ralentit les insertions. Donc à faire avec parcimonie. Par exemple, j’ai ajouté un index sur la date car je m’en sers tout le temps dans mes query. Je n’ai mis que cela. Le reste je ferais un Scan mais j’en ai peu.

Attention, si vous comptez passer par la synchro Realm par après, il faudra ajouter un objectID géré par Realm

Merci pour le retour @Krysbe mais je ne suis pas sûr de comprendre. J’ai cru lire que Realm ne gérait pas en interne d’id au sens généré. Vous pouvez m’éclairer ?
Merci :slight_smile:

Voici par exemple un objet Realm configuré pour la synchro Mongodb

class person: Object {

@objc dynamic var _id:ObjectId = ObjectId.generate()
@objc dynamic var partitionKey = "PartitionName"

@objc dynamic private var _name: String
@objc dynamic private var _age: Int

override static func primaryKey() -> String {
    "_id"
}

}

D’ailleurs pour Realm Sync, l’ID est d’office _id donc faire attention à comment vous nommez vos variables dans vos objects.

Après rien ne vous empêche d’avoir vos propres ID avec des UUID, en plus de l’objectID

Encore merci. Je n’ai pas encore branché Realm à mon dataManager. Mais j’ai l’impression que ce dont tu parles, c’est pour la Synchro online, pas pour du Realm en local. J’ai bon ou tout faut ? :slight_smile:

Tu as tout bon. C’est pour cela que je parlais de synchro Realm. De juste y penser au cas où vous l’envisagez, de ne pas mal nommer vos variables au risques d’avoir une variable nécessaire déjà utilisée.

Du coup si un jour j’utilise une BD qui « impose » un Id, je ferais l’overwrite dans la classe qui gère la BD. Je n’aurais pas à changer mes classes dans le DataManager.
Encore merci pour l’info @Krysbe