10
votes

Commande de données de base avec un utableview et Nsorderedset

Quelles sont les étapes que je dois exécuter pour implémenter une commande définie par l'utilisateur dans un utablevoller avec les données de base comme magasin de support?

Dois-je encore répondre à -TableView: MOverowatidExpath: TOINDEXPATH: toindexPath: ou est le modèle ré-commande traité automatiquement par la vue table? Puis-je simplement vérifier la case à cocher "commandée" dans le fichier de modèle de données de base et vous attendre à ce qu'il transmet les changements de la vue Tableau au magasin, ou dois-je faire plus? Dois-je modifier la façon dont mon fetchedResultSluTroller obtient ses objets (E.G. Ajouter un descripteur de tri)?


0 commentaires

3 Réponses :


0
votes

J'aurais un attribut à l'entité de données de base, disons que c'est un nsnumber appelé sortOrdon .

Lorsque vous introduisez un nouvel objet dans cette liste, attribuez l'ordre dans la commande croissante, de sorte que l'ordre de tri par défaut est là.

Enfin, indiquez à votre fetchedResultStroller pour utiliser un Extra SortDescriptor pour cet attribut de certification.

Lorsqu'un utilisateur ajuste la position d'une entrée, vous pouvez définir le certificat sur la moyenne de l'entrée avant et après.

(juste une idée --- Je n'ai pas traité ce problème ou devait la mettre en œuvre, mais l'envisageait de le faire pour mon projet.)


5 commentaires

Merci pour la réponse, mais c'est ce que je veux éviter de faire. Soi-disant, les nouvelles API des données de base dans iOS 5 commanderont automatiquement pour vous. C'est un problème pelliculaire à mettre en œuvre, en particulier avec la réinscription.


Joli! Je devrai vérifier sur cette question une fois que cela obtient une bonne réponse alors :)


Aussi: apparemment iCloud ne prend pas en charge les données commandées; Si vous synchronisez avec iCloud, vous n'avez pas de chance pour cela: "Lorsqu'il est utilisé avec iCloud, il existe plusieurs limitations avec le magasin SQLite à l'heure actuelle: les relations ordonnées ne sont pas prises en charge." développeur.apple.com/library/ios/# Releasenotes / DataManagement / ...


Oui, je viens de voir ça aujourd'hui aussi. Je ne comprends pas du tout pourquoi la commande n'est pas compatible avec iCloud, mais je dirais que ce sera à l'avenir. La limitation de la migration des données est probablement la même.


C'est en fait incroyablement boiteux que les données de base ne prennent pas en charge la cartographie d'une commande + affichage sur la tableviews et la collectionViews hors de la boîte!



1
votes

La meilleure pratique ici est de ne pas utiliser fetchedResultController car il nécessite un descripteur de tri, comme vous l'avez mentionné. Vous pouvez utiliser une propriété factice mais cela n'est clairement pas une bonne pratique. Au lieu de cela, utilisez ObjectAindex dans TableView: CellfrotIdExpath: et rechargez les données de la table lorsque vous devez, peut-être utiliser Observation de la valeur de la clé , bien que dépend de votre cas d'utilisation, il peut y avoir des approches plus simples et moins importantes.

Et oui, vous devrez mettre en œuvre TableView: moverowatudexpath: ToindexPath: toindexPath:

Voir aussi

NsfetchedResultsTroller et NsOrderedset Relations


0 commentaires

8
votes

Vous n'avez pas besoin d'abandonner NsfetchedResultSluStroller ou NSOrderedset strong>. Si vous collez avec Nsorderedset, le moyen facile consiste simplement à ajouter une méthode à votre sous-classe NsmanagedObject. Donc, par exemple, si vous avez un livre d'objet avec un ensemble de chapitres commandé, vous pouvez ajouter une méthode à l'objet Chapitres:

fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"indexInBookChapters" ascending:YES]];


11 commentaires

Dites-vous que c'est une mauvaise solution parce que cela ne fonctionne pas pour certains scénarios rares? Si je devais modéliser le scénario rare de commandé de nombreuses relations à de nombreuses personnes, je n'utiliserais probablement probablement qu'un tiers objet, disons un bookchapterPair et j'ajouterais les propriétés d'indexation là-bas. Donc, je pourrais obtenir les index via bookchapterpair.indexinkook ou bookchapterpair.indexinchapter. Ensuite, configurez simplement le NsfetchedResultController pour aller chercher l'entité BookChapterPair au lieu du chapitre ou du livre. Facile!


Votre solution n'est pas utilisée pour commander de nombreuses relations à de nombreuses relations, qui sont à peine "rare" (sauf dans votre exemple de livres et de chapitres).


L'introduction d'un troisième objet peut avoir été la seule solution avant que les données de base ont pris en charge les relations ordonnées, mais sont néanmoins un peu maladroites et ne répondent pas à la question posée.


En fait, dans la documentation de Apple sur les données de base de nombreuses relations à de nombreuses relations, ils recommandent un tiers objet pour de nombreux scénarios, même en disant "un avantage de l'entité intermédiaire, c'est que vous pouvez également l'utiliser pour ajouter plus d'informations à la relation - par exemple A" AmiInfo "L'entité pourrait inclure une indication de la force de l'amitié avec un attribut" classement "." Dans notre cas, les informations supplémentaires seraient les index. BTW, je n'ai dit que c'était rare parce que même si j'ai rencontré de nombreuses utilisations pour de nombreuses relations à de nombreuses personnes, je n'ai jamais rencontré celui qui nécessitait la commande. Avez-vous?


Il est logique que la documentation d'Apple mentionne la seule solution possible avant que l'IOS 5 a introduit des relations ordonnées dans des données de base. Mais je trouve maintenant ajouter un troisième objet au modèle de données simplement pour maintenir l'ordre superflu. Parce que la question posée sur Nsorderedset, j'ai également assumé que l'astituant souhaite apprendre à utiliser des relations ordonnées.


Les chansons appartenant à des listes de lecture sont un exemple de commandité de nombreuses relations


Vous devriez lire la documentation vous-même: développeur.apple.com/Library/mac/documentation/cocoa/conceptu al / ... Il n'a rien à voir avec commandé plusieurs-à-plusieurs, juste beaucoup -à-beaucoup en général. C'est à dire. Même lors de l'utilisation de Nsset, vous voulez toujours toujours un objet intermédiaire 3ème.


Vous avez raison: L'utilisation d'un troisième objet n'a rien à voir avec Nsorderset, il n'appartient donc pas ici. (Merci pour le lien)


@RichardVoyable, merci pour votre conseil d'ajouter une catégorie à un modèle!


@RichardVoyable Avez-vous essayé cela? NsfetchedResultSluTroller ne fonctionnera pas avec un tel descripteur de tri, si vous utilisez SQLite Store.


@Shmidt, oui j'utilise cette méthode mais pas avec un magasin SQLite. Je pensais que quelqu'un d'autre avait mis un commentaire précédemment souligné que cela ne fonctionne pas avec SQLite, mais je ne vois plus ce commentaire.