82 votes

Base De Données De La Clé Primaire

Cela peut sembler stupide, mais je ne pouvais toujours pas à comprendre comment marquer un attribut comme clé primaire dans le fichier xcdatamodel. Mon stockage persistant est fichier sqlite. Quelqu'un peut-il m'aider?

Dans ce cas, comment puis-je "valider" un ID unique? Dois-je écrire une méthode de validation ou quelque chose?

94voto

Mike Abdullah Points 9464

Vos options sont les suivantes:

  • Utiliser -[NSManagedObject objectID]. Notez que cet ID est temporaire jusqu'à ce que l'objet est enregistré pour la première fois ou que vous appelez -[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
  • Utiliser l' CFUUID famille de fonctions pour générer un UUID pour chaque objet dans votre -awakeFromInsert méthode
  • Créez votre propre clé primaire comme le système qui stocke un nombre entier dans votre modèle et l'incrémente avec la création de chaque objet

Il n'y a pas de bonne façon de valider qu'une propriété est unique. Le plus proche que vous obtiendrez est de s'assurer qu'il est unique au moment de la création, puis de mettre en œuvre une coutume méthode de définition qui s'arrête jamais quelqu'un changement de l'ID.

49voto

Marc Charbonneau Points 30464

Gardez à l'esprit que l'essentiel des Données est un objet graphique persistance cadre, pas une base de données. Des choses comme des clés primaires sont extraites à l'écart parce qu'ils dépendent de la mise en œuvre de la persistance de la boutique.

24voto

Paul Tomblin Points 83687

Base de Données fait sa propre clé primaire - vous n'avez pas à en ajouter un. Vous pouvez le récupérer avec

NSManagedObjectID *moID = [managedObject objectID];

14voto

kitschmaster Points 798

parfois, en cas de piratage de l'un des besoins réels de l'int de la clé primaire. voici comment on peut l'attraper:

NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID];
int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];

malgré CoreData d'être un objet graphique, si l'on regarde le CoreData généré une base de données SQLite de données, cette façon de s'emparer de la clé primaire d'une NSManagedObject ne devrait pas être un problème. ii ont utilisé CoreData et le faible niveau de sqlite3 bibliothèque C ensemble dans le même code et en passant des clés primaires de CoreData pour sqlite3 pour aller chercher des enregistrements fonctionne très bien.

! si Vous avez l'intention d'utiliser ce code dans la production, être conscient de l'éventualité de changements internes à la manière de la db de la clé primaire se transforme en un URIRepresentation, il pourrait frein de Votre code.

profitez de

0voto

danielemm Points 724

Sans le piratage NSManagedObjectID vous pouvez effectuer un enregistrement rapide de votre attribut avant de gérer votre collecte des données à distance.

J'ai fait une méthode utilitaire, vérifiez ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X