2017-08-24 3 views
1

J'ai un NSManagedObject qui a une propriété (transformable) NSArrayarrayProperty.NSFetchRequest basé sur la taille de la propriété de tableau

Je voudrais exécuter une requête d'extraction de filtrage pour les objets dont la taille est inférieure à la propriété 5. J'ai essayé

[NSPredicate predicateWithFormat:@"[email protected] <= 5"] 

et

[NSPredicate predicateWithFormat:@"arrayProperty[SIZE] <= 5"] 

mais aucun d'entre eux travaillent (ce qui donne Unsupported function expression count et Unsupported function [SIZE]).

Existe-t-il un moyen d'y parvenir?

+1

Pas si vous récupérez à partir d'un magasin SQLite: le transformable est stocké en tant que blob - CoreData ne peut pas convertir votre prédicat en une clause SQL où l'analyse du blob est possible. Soit tout récupérer et filtrer en mémoire, ou vérifier si votre tableau doit en fait être modélisé comme une relation to-many. – pbasdf

Répondre

2

Ce genre de chose n'est pas possible avec des propriétés transformables. Transformable sont pratiques pour stocker des données, mais une fois qu'ils sont stockés, c'est tout ce qu'ils sont - un tas d'octets sans aucune information sur la structure de données qui les a créés. SQLite ne sait pas que c'est un tableau, donc il n'est pas capable de faire des choses comme compter combien d'éléments sont dans le tableau.

Si vous utilisez des propriétés transformables, vous perdez toute possibilité de filtrage en fonction de celles-ci, sauf pour les tests extrêmement basiques comme si la valeur est nulle.

Si vous devez effectuer ce type de filtrage, vous devrez réfléchir à la manière de modifier votre modèle de données. Une possibilité serait qu'au lieu de sauvegarder un tableau, créez une nouvelle entité avec une relation to-many pour stocker les valeurs.

+0

Merci. C'est ce que je pensais mais je n'ai pas pu le trouver nulle part. Va ajouter un NSNumber * arrayCount à mon modèle ... – vib