2011-11-09 11 views
8

Sto cercando di memorizzare un valore nullo nel database, ma ogni volta che carico il valore ottengo 0.inserendo null come valore intero in un database

Dichiaro il campo proprio come "intVal integer"

Questo è come posso recuperare è:??

Integer x; 

x = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); 

è che affidabile o è undefined

Quindi mi sembra non si può salvare nulla come integerValue indefinita

Molte grazie

risposta

15

Da the getInt() documentation:

restituisce il valore della colonna richiesto come un int. Il risultato e se questo metodo genera un'eccezione quando il valore della colonna è nullo, il tipo di colonna non è un tipo integrale o il valore intero è esterno all'intervallo [Intero.MIN_VALUE, Integer.MAX_VALUE] è definito dall'implementazione.

Quindi, è un dettaglio di implementazione su cui non si dovrebbe fare affidamento.

È comunque possibile ottenere l'effetto desiderato: è sufficiente eseguire il controllo Null prima di leggere il valore.

int index = cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X); 
Integer x = null; 
if (!cursor.isNull(index) 
    x = cursor.getInt(index); 

// now x is either null or contains a valid value 
+0

grazie mille ... – user387184

0

SQLite è digitato in modo dinamico. Poiché hai definito la colonna di tipo Integer e non ha trovato un valore, ha restituito 0 in base al suggerimento.

Prova utilizzando String come tipo di colonna

+2

Cosa succede se vuoi sapere se il campo memorizzato era vuoto anziché zero? Come fai a capire la differenza qui? – Stoff81

0

Come accennato Rajdeep Dua, SQLite utilizza una tipizzazione dinamica. Ecco ciò che il documentation dice:

La maggior parte dei motori di database SQL (SQL ogni motore di database diverso da SQLite, per quanto ne sappiamo) utilizza statica, battitura rigida. Con la tipizzazione statica , il tipo di dati di un valore è determinato dal relativo contenitore: la colonna specifica in cui è memorizzato il valore.

SQLite utilizza un sistema di tipo dinamico più generale. In SQLite, il tipo di dati di un valore è associato al valore stesso, non al suo contenitore .

La documentazione Android dice che il risultato del getInt() quando il valore della colonna è null è la realizzazione definito. Per me, restituisce anche 0.

così ho usato getString() invece, anche se il risultato di questo metodo è anche l'implementazione definita, per me, restituisce null quando il valore della colonna è null, o di una stringa contenente il numero altrimenti.

Così il codice simile a questo:

Strint strVal = cursor.getInt(cursor.getColumnIndexOrThrow(MyDBAdapter.KEY_X)); 

if(strVal != null){ 
    int intVal = Integer.parseInt(strVal); 
} 
Problemi correlati