2009-07-27 10 views
6

Nel mio modello di dati di base, ho un'entità con un attributo NSNumber facoltativo.Memorizzazione di NSNumber opzionale nei dati principali

Come si verifica se il valore in quell'attributo è valido o no?

Quando provo per nil ... non funziona.

[self numberAttribute] == nil // always returns NO 

Quando provo per un valore zero int, non funziona.

[[self numberAttribute] intValue] == 0 // always returns no 

È un dato di fatto, [[auto numberAttribute] intValue]] restituisce qualcosa che sembra sospetto, come un puntatore a un indirizzo di memoria.

Qualcuno ha idea di cosa sto facendo male?

MODIFICA: OK, il bug si trovava in una parte del codice completamente non correlata. NSNumber e Core Data funzionano esattamente come ci si aspetterebbe. Detto questo, ho intenzione di andare con l'approccio suggerito di rendere l'attributo non opzionale e specificando 0 come valore predefinito.

Basta mettere questa nota qui per un po 'per chiunque stia guardando questa domanda, quindi la sto eliminando.

+1

Non ho ancora abbastanza ripetizioni da modificare, ma il tuo secondo esempio di codice ha parentesi non bilanciate (2 parentesi di apertura e 3 di chiusura). – Mark

+0

Grazie mille. Fisso. – mmc

+0

numeroAttributo è specificato come float nel modello dati? Come viene dichiarata la proprietà per numberAttribute? A cosa assomigliano le implementazioni accessorie (se non si sta utilizzando @dynamic accessors.) Senza queste informazioni, è impossibile rispondere con precisione alla domanda. –

risposta

0

Se si ottiene un valore elevato che assomiglia a un puntatore, forse è NaN (non un numero)?

Se è così, si potrebbe verificare con:

isnan([[self numberAttribute] doubleValue]) 

O, forse si tratta di qualche altra costante lungo le linee di NSNotFound (anche se probabilmente più Core Data specifica).

+0

Provato diversi sapori di questa tecnica, non ha funzionato. Il valore che ottengo non è una costante e riporta nel debugger (colonna Riepilogo) come "Invalido". È abbastanza bizzarro, ho pensato che se non avessi impostato l'attributo e se fosse stato contrassegnato come "opzionale" con un valore predefinito di "0" nel file .xcdatamodel, questo non sarebbe stato così difficile da realizzare. – mmc

+0

Se lo hai contrassegnato come facoltativo, il valore predefinito non verrebbe impostato ... Penso che tu stia recuperando una specie di oggetto non valido che rappresenta uno stato indeterminato. Non riesco a trovare in Core Data come si supponga di riconoscere un oggetto non valido ... –

+0

Ho verificato con qualcun altro che ha un progetto Core Data funzionante con attributi opzionali - ha pensato che un valore non impostato dovrebbe essere di fatto nulla, proprio come stavi cercando. Quindi andrei con la teoria che stai ricevendo indietro un oggetto NSNumber come Postne stava postulando. –

5

Secondo il documentation,

È possibile specificare che un attributo è facoltativo, cioè non è necessario avere un valore. In generale, tuttavia, si è scoraggiati dal farlo, in particolare per i valori numerici (in genere è possibile ottenere risultati migliori utilizzando un attributo obbligatorio con un valore predefinito, nel modello di 0). La ragione di ciò è che SQL ha un comportamento di confronto speciale per NULL diverso da quello di Objective-C. NULL in un database non è uguale a 0 e le ricerche per 0 non corrispondono alle colonne con NULL.

false == (NULL == 0) 
false == (NULL != 0) 

Inoltre, NULL in un database non è equivalente a una stringa vuota o blob dati vuota, alternativamente:

false == (NULL == @"") 
false == (NULL != @"") 

Quindi, cercare una prova con NULL, che è non è nulla. Meglio ancora, imposta un valore predefinito e cambia l'attributo come non opzionale. Questo è quello che ho finito con i miei modelli, e in pratica funziona abbastanza bene.

Modifica: Vedere il mio commento sopra. Ho provato a creare un nuovo oggetto gestito con un attributo opzionale non impostato ed era nullo.

BOOL isNil = ([newManagedObject numberAttribute] == nil); //equals YES 

Un'altra edit: Sono tornato in questo più tardi e controllato un oggetto caricato dalla cache nel debugger (gdb è tuo amico!). Stava cercando di accedere alla posizione di memoria 0x0, che è NULL.

+0

Sì, ma la vera domanda è se un attributo è dichiarato opzionale - come si controlla se è impostato o meno? –

+0

Vero. Ho fatto qualche altro controllo e aggiunto dettagli alla mia risposta. – Don

+0

Sono d'accordo ora che è il controllo corretto, il mistero è che non sta ottenendo nulla, ma qualche valore strano ... –

0

Se sembra un puntatore, può essere un puntatore all'istanza NSNumber. Assicurati di non avere corrispondenza tra il modello di dati di base e la classe (ad esempio NSInteger dove è previsto lo NSNumber*).

Se si dispone di uno scalare nella classe, è necessario notare che si è in setNilValueForKey:.

+1

Questo mi sembra molto probabilmente un bene (non che qualcuno con quel cappello fantastico abbia bisogno di backup in alcun modo). –