Kerndaten Transformierbare Attribute, die NICHT mit NSPredicate funktionieren

8

Ich verwende oft Transformable für Core Data attributes , damit ich sie später ändern kann.

Es sieht jedoch so aus, als ob ich NSPredicate verwenden möchte, um ein NSManagedObject zu finden, indem ich "uniqueKey == %@" oder "uniqueKey MATCHES[cd] %@" verwende. Es funktioniert nicht so, wie es sollte.

Es fehlen immer übereinstimmende Objekte, bis ich die Attribute des uniqueKey des übereinstimmenden Objekts so ändere, dass sie eine bestimmte Klasse wie NSString oder NSNumber haben.

Kann jemand die Einschränkung der Verwendung von NSPredicate mit Transformable -Attributen erklären?

    
petershine 24.05.2011, 00:31
quelle

3 Antworten

5

Hinweis : Ich bin mir nicht sicher, ob / wenn sich das seit 5/2011 geändert hat (von Scott Ahtens akzeptierter Antwort), aber Sie können absolut mit NSPredicate nach transformierbaren Attributen suchen. Scott hat richtig erklärt, warum deine Annahmen gebrochen wurden, aber wenn Kann jemand die Einschränkung der Verwendung von NSPredate mit transformierbaren Attributen erklären? war deine Frage, er deutete an, dass es nicht möglich ist, und das ist falsch.

>

Da dies der erste Google-Treffer für " Core Data transformable value search nspredicate " ist (was ich suchte, um nach Inspiration zu suchen), wollte ich meine funktionierende Antwort hinzufügen.

Verwendung von NSPredate mit transformierbaren Eigenschaften

Kurze, berauschende Antwort: Sie müssen schlau über Ihre Datentransformatoren sein. Sie müssen den Wert in NSData umwandeln, die das enthält, was ich "primitive identifizierende Information" nenne, d. H. Die kleinste, höchst identifizierbare Menge von Bytes, die zur Rekonstruktion Ihres Objekts verwendet werden kann. Lange Antwort, ...

In erster Linie:

  • Wussten Sie eigentlich, ein transformierbares Attribut zu verwenden? Wenn ein unterstützter Datentyp - auch Binärdaten - ausreichen sollte, verwenden Sie ihn.
  • Verstehen Sie, was transformierbare Attribute tatsächlich sind? Wie packen und entpacken sie Daten zum und vom Geschäft? Lesen Sie die nicht standardmäßigen persistenten Attribute in der Apple-Dokumentation.
    • Nachdem Sie die obigen Informationen gelesen haben, fragen Sie nach: funktioniert der benutzerdefinierte Code, der ein unterstütztes "Backing-Attribut" versteckt, für Sie? Vielleicht benutze diese Technik.

Nun, nach diesen Überlegungen sind transformierbare Attribute ziemlich glatt. Ehrlich gesagt, schien das Schreiben eines NSValueTransformers "FooToData" für Foo-Instanzen in NSData sauberer als das Schreiben von viel adhoc-benutzerdefiniertem Code. Ich habe keinen Fall gefunden, in dem Core Data nicht weiß, dass es die Daten mithilfe des registrierten NSValueTransformers transformieren muss.

Um fortzufahren, gehen Sie einfach auf diese Bedenken ein:

  • Haben Sie Core Data gesagt, welchen Transformator Sie verwenden sollen? Öffnen Sie das Basisdatenmodell in der Tabellenansicht, klicken Sie auf die Entität, klicken Sie auf das Attribut, und laden Sie das Datenmodell-Inspektorfenster. Unter "Attribut Typ: Transformable", setzen Sie "Name" zu Ihrem Transformator.
  • Verwenden Sie einen Standard-Transformer (siehe auch die vorherigen Apple-Dokumente) oder schreiben Sie einen eigenen Transformer - transformedValue: muss NSData zurückgeben.
    • NSKeyedUnarchiveFromDataTransformerName ist der Standard-Transformer und reicht möglicherweise nicht aus oder zeichnet etwas vorübergehende Instanzdaten, die bewirken können, dass zwei ähnliche Objekte unterschiedlich sind, wenn sie gleich sind.
  • Der transformierte Wert sollte nur - wie ich es nenne - "primitive Identifizierungsinformationen" enthalten. Der Speicher wird Bytes vergleichen, also zählt jedes Byte.
  • Sie können Ihren Transformator auch global registrieren. Ich muss dies tun, da ich sie an anderer Stelle in der App wiederverwende - z. %Code%

Sie möchten wahrscheinlich Transformationen nicht stark beanspruchte Datenoperationen verwenden - z. ein großer Import, bei dem die Primärschlüsselinformationen Transformatoren verwenden - yikes!

Und dann benutze ich das am Ende einfach, um auf Modellen mit NSPredicates nach Gleichheit für High-Level-Objektattribute zu suchen - z. "% K ==% @" - und es funktioniert gut. Ich habe einige der verschiedenen übereinstimmenden Begriffe nicht ausprobiert, aber ich wäre nicht überrascht, wenn sie manchmal und andere nicht arbeiten würden.

Hier ist ein Beispiel für einen NSURL to NSData-Transformer. Warum nicht einfach die Zeichenfolge speichern? Ja, das ist in Ordnung - das ist ein gutes Beispiel für benutzerdefinierten Code, der das gespeicherte Attribut maskiert. Dieses Beispiel veranschaulicht, dass der stringifizierten URL ein zusätzliches Byte hinzugefügt wird, um aufzuzeichnen, ob es sich um eine Datei-URL handelte oder nicht - damit können wir wissen, welche Konstruktoren beim Entpacken des Objekts zu verwenden sind.

%Vor%

...

%Vor%     
greymouser 16.02.2014, 18:17
quelle
4

Transformierbare Attribute werden normalerweise als archivierte Binärdaten beibehalten. Daher versuchen Sie, eine Instanz von NSData mit einer Instanz von NSString oder NSNumber zu vergleichen.

Da diese Klassen die gleichen Daten auf verschiedene Arten interpretieren, werden sie nicht als übereinstimmend betrachtet.

    
Scott Ahten 24.05.2011 06:50
quelle
-1

Sie können diesen Weg versuchen

%Vor%     
Jimi 24.06.2012 02:17
quelle