web-dev-qa-db-fra.com

Stocker NSArray dans un exemple de code de données de base?

Je recherche un exemple de code sur la façon de stocker un NSArray dans Core Data depuis un certain temps, mais je n'ai pas eu de chance. Quelqu'un voudrait-il me diriger vers un tutoriel ou un exemple, ou mieux encore écrire un simple échantillon comme réponse à cette question? J'ai lu this mais cela ne montre pas un exemple de la façon d'implémenter un attribut transformable qui est un NSArray. Merci d'avance!

29
Stunner

Si vous avez vraiment besoin de le faire, alors encodez en tant que données. J'ai simplement créé un nouveau fichier appelé receive en tant que NSData (données binaires).

Puis dans l'implémentation NSManagedObject:

-(void)setReceiveList:(NSArray*)list{
     self.receive = [NSKeyedArchiver archivedDataWithRootObject:list];
}

-(NSArray*)getReceiveList{
    return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive];
}
37
Resh32

Les attributs transformables sont la bonne façon de conserver les valeurs d'objet autrement non prises en charge dans Core Data (telles que NSArray). De Guide de programmation des données principales: attributs persistants non standard :

L'idée derrière les attributs transformables est que vous accédez à un attribut en tant que type non standard, mais en arrière-plan, Core Data utilise une instance de NSValueTransformer pour convertir l'attribut vers et depuis une instance de NSData. Core Data stocke ensuite l'instance de données dans le magasin persistant.

Un attribut transformable utilise un NSValueTransformer pour stocker un objet autrement non pris en charge dans le magasin persistant. Cela permet à Core Data de stocker à peu près tout ce qui peut être représenté comme NSData - ce qui peut être très utile. Malheureusement, les attributs transformables ne peuvent pas être mis en correspondance dans un prédicat ou utilisés dans le tri des résultats avec le NSSQLiteStoreType. Cela signifie que les attributs transformables ne sont utiles que pour le stockage, pas pour la découverte d'objets.

Le transformateur par défaut permet à tout objet qui prend en charge NSCoding (ou NSSecureCoding) d'être stocké en tant qu'attribut transformable. Cela inclut NSArray, UIColor, UIImage, NSURL, CLLocation et bien d'autres. Il n'est pas recommandé de l'utiliser pour les données qui peuvent être arbitrairement volumineuses, car cela peut avoir un impact significatif sur les performances lors de l'interrogation du magasin. Les images, par exemple, ne conviennent pas aux attributs transformables - ce sont de grands sacs d'octets qui fragmentent le magasin. Dans ce cas, il est préférable d'utiliser les capacités de stockage des enregistrements externes de Core Data ou de stocker les données séparément sous forme de fichier et de stocker l'URL du fichier dans Core Data. Si vous devez stocker un UIImage dans Core Data, assurez-vous de connaître les compromis impliqués.

La création d'un attribut transformable est simple:

• Dans l'éditeur Xcode Core Data Model, sélectionnez l'attribut de modèle que vous souhaitez modifier. Dans l'inspecteur de droite, définissez le type d'attribut sur "Transformable". Vous pouvez laisser le champ "Nom" vide pour utiliser le transformateur par défaut. Si vous utilisiez un transformateur personnalisé, vous devez saisir le nom de la classe ici et enregistrer la classe en utilisant +[NSValueTransformer setValueTransformer:forName:] Quelque part dans votre code.

Core Data Model Editor Transformable Attribute

• Dans votre en-tête de sous-classe NSManagedObject, déclarez la propriété qui décrit l'attribut transformable avec le type correct. Dans ce cas, nous utilisons NSArray:

@property (nonatomic, retain) NSArray *transformedArray;

• Dans le fichier d'implémentation de la sous-classe NSManagedObject, la propriété doit être dynamique:

@dynamic transformedArray;

Et vous avez terminé. Lorsqu'un objet de valeur NSArray est passé à setTransformedArray:, Ce tableau est conservé par l'objet. Lorsque le contexte est enregistré, Core Data transforme le NSArray en NSData en utilisant le NSValueTransformer décrit dans le modèle. Les NSData octets seront enregistrés dans le magasin persistant.

29
quellish

Vous ne stockez pas un NSArray en mode natif dans Core Data. Vous devez transformer les valeurs stockées dans le tableau en quelque chose que Core Data peut utiliser, puis enregistrer les données dans le magasin afin de pouvoir les pousser et les tirer vers votre NSArray selon vos besoins .

26
Philip Regan

La réponse de Philip est juste. Vous ne stockez pas de tableaux dans Core Data. Cela va totalement à l'encontre de la raison d'être de Core Data. La plupart du temps, vous n'avez pas besoin des informations du tableau, mais une seule et celle-ci peut être chargée dynamiquement par Core Data. Dans le cas des collections, cela ne fait aucune différence si vous parcourez un tableau de vos propriétés quelconques ou d'un tableau de résultats récupérés sur un NSSet (qui est fondamentalement juste un tableau aussi).

Voici l'explication de ce que Philip a dit. Vous ne pouvez pas stocker directement un tableau, mais vous pouvez créer une liste de propriétés à partir de celui-ci. Il y a une méthode dans tous les types de tableaux NS qui vous donne une chaîne agréable et propre et des chaînes d'amour de données de base. Ce qui est cool avec les listes de propriétés stockées sous forme de chaînes, c'est qu'elles peuvent devenir ce qu'elles étaient. est une méthode pour cela dans NSString. Tataaa ...

Il y a bien sûr un prix. Les tableaux en tant que listes de propriétés peuvent devenir gigantesques et cela ne va pas bien avec les appareils iOS où RAM est limité. Essayer d'enregistrer un tableau dans les données de base indique une mauvaise conception d'entité, en particulier pour les grandes données. petit tableau est OK pour des raisons de vitesse.

Une autre méthode, moins consommatrice d'espace, consiste à utiliser des listes de propriétés binaires. Ceux-ci se rapprochent des tailles Zip lorsqu'ils sont stockés dans Core Data ou directement dans le système de fichiers. L'inconvénient est que vous ne pouvez pas simplement les ouvrir et les lire comme un fichier XML ou JSON. Pour le développement, je préfère quelque chose de lisible par l'homme et pour la version binaire. Une constante liée à la valeur DEBUG dans le préprocesseur s'occupe de cela, donc je n'ai pas à changer mon code.

8
Helge Becker

Core Data stocke des instances de NSManagedObject ou des sous-classes de celui-ci. NSManagedObject lui-même ressemble beaucoup à un dictionnaire. Les relations entre plusieurs objets sont représentées sous forme d'ensembles. Core Data n'a pas de liste ordonnée qui correspondrait à un tableau. Au lieu de cela, lorsque vous récupérez des objets d'un magasin Core Data, vous utilisez une demande d'extraction. Cette demande d'extraction peut spécifier un ou plusieurs descripteurs de tri utilisés pour trier les objets, et les objets renvoyés par une demande d'extraction sont stockés dans un tableau.

Si la préservation de l'ordre des objets est importante, vous devrez inclure un attribut dans votre entité qui peut être utilisé pour trier les objets lorsque vous les récupérez.

1
Caleb