2010-02-02 11 views
6

Ho utilizzato attributi trasformabili nei dati di base per trasformare oggetti grezzi come immagini e colori in dati grezzi. Ho preso this ...Dati principali dell'iPhone: gli attributi trasformabili devono essere trasformati solo in Dati?

L'idea alla base trasformabili attributi è che si accede a un attributo come un tipo non standard, ma dietro le quinte Core Data utilizza un istanza di NSValueTransformer al convertire l'attributo da e verso un'istanza di NSData. Core Data quindi memorizza l'istanza di dati nell'archivio persistente .

... per indicare che è possibile convertire solo le cose da e verso i dati e non uno degli altri tipi di attributi come le stringhe.

Mi è appena venuto in mente che questo potrebbe non essere il caso. La documentazione potrebbe semplicemente parlare del caso più comune. IIRC, nelle associazioni di Cocoa, le trasformazioni possono essere in gran parte arbitrarie. È possibile trasformare, ad esempio, un NSURL in una NSString per la visualizzazione e quindi invertirla.

Prima di perdere tempo a sperimentare e ottenere un risultato confuso, mi chiedevo se qualcuno sapesse con certezza se la trasformazione è solo per e dai dati.

risposta

4

Corretto. È necessario trasformare il proprio attributo in un oggetto NSData. Dovresti serializzare un NSURL a NSData - e il trasformatore di default NSKeyedUnarchiveFromDataTransformerName lo farà per te.

Un altro approccio e quello che utilizzo per gli URL consiste nel mantenere due proprietà parallele. Una proprietà temporanea di tipo non definito per l'URL e una seconda proprietà persistente di tipo stringa per il backing store. Costruisco pigramente l'URL dalla stringa la prima volta che viene richiesto e aggiorno la proprietà della stringa ogni volta che viene modificato l'URL.

Non c'è modo di applicarlo, ma davvero non si vuole usare la proprietà stringa al di fuori della classe dell'entità. Generalmente faccio la definizione @property per l'attributo di stringa privato per ricordare a me stesso di non usarlo.

+0

Sì, ho usato lo stesso approccio per un po 'di tempo ora volevo solo verificare che non avessi frainteso qualcosa. – TechZen

+2

Ma il Doc ufficiale mostra uno snippet di codice di esempio usa '+ (Class) transformValueClass {return [NSString class]; } ', sembra che' NSValueTransformer' possa essere trasformato in 'NSString' .. Sono totalmente confuso ..: S – Kjuly

+0

Oh..anno 10 ... – Kjuly

0

Non ho abbastanza punti per commentare, quindi devo dare il mio contributo sotto forma di risposta. Ho appena provato a fare esattamente ciò che @Amaud ha suggerito, utilizzando uno NSValueTransformer per convertire gli oggetti NSURL sugli oggetti NSString per un attributo trasformabile. Sfortunatamente, Core Data si aspetta comunque un'istanza NSData dal trasformatore, indipendentemente dallo transformedValueClass. Core Data crea ancora il database SQLite con una colonna BLOB per quell'attributo trasformabile e il salvataggio delle entità provoca un arresto anomalo con uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x608000075bc0'. Core Data sta tentando di richiamare [NSData bytes] nell'istanza NSString fornita dal mio trasformatore. Questo mi sembra un grosso buco in Core Data, poiché sono sicuro che ci sono innumerevoli tipi non standard che potrebbero essere archiviati e interrogati come attributi di stringa.

Sembra che l'unica opzione, oltre all'uso di NSString, sia di fare come descrive @Alex e utilizzare proprietà transitorie e valori derivati. I dati di base non lo rendono molto pulito, tuttavia, poiché, come dichiarato da @Alex, non c'è modo di imporre l'uso esclusivo degli accessor delle proprietà transitori.

Problemi correlati