web-dev-qa-db-fra.com

Clé primaire des données de base

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

Dans ce cas, comment "valider" un identifiant pour qu'il soit unique? Dois-je écrire une méthode de validation ou quelque chose?

75
Mugunth

Vos options sont:

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

Il n'y a aucun bon moyen de valider qu'une propriété est unique. Le plus proche que vous obtiendrez est de vous assurer qu'il est unique au moment de la création, puis d'implémenter une méthode de définition personnalisée qui empêche quiconque de modifier l'ID.

87
Mike Abdullah

Gardez à l'esprit que Core Data est un cadre de persistance de graphe objet, pas une base de données. Des choses comme les clés primaires sont abstraites car elles dépendent de l'implémentation du magasin persistant.

43
Marc Charbonneau

Core Data crée sa propre clé primaire - vous n'avez pas besoin d'en ajouter une. Vous pouvez le récupérer avec

NSManagedObjectID *moID = [managedObject objectID];
20
Paul Tomblin

parfois, lors du piratage, il faut l'intégralité de la clé primaire. voici comment on peut le saisir:

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

bien que CoreData soit un graphique d'objet, si l'on regarde les données de base de données SQLite générées par CoreData, cette façon de récupérer la clé primaire d'un NSManagedObject ne devrait pas être un problème. ii ont utilisé CoreData et la bibliothèque sqlite3 C de bas niveau ensemble dans le même code et le passage des clés primaires de CoreData à sqlite3 pour récupérer les enregistrements fonctionne très bien.

! si vous avez l'intention d'utiliser ce code en production, soyez conscient des modifications internes possibles de la façon dont la clé primaire db se transforme en représentation URI, cela pourrait freiner votre code.

prendre plaisir

14
kitschmaster

Sans pirater NSManagedObjectID, vous pouvez effectuer une vérification rapide de votre attribut avant de gérer votre collecte de données à distance.

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

0
danielemm