android
  • sqlite
  • sqlite3
  • 2012-09-24 2 views 5 likes 
    5

    Nachfolgend ist die Abfrage, die ich verwende, um einen int-Wert zu erhalten, der einem bestimmten Feld in meiner sqlite-db-Tabelle entspricht.Sqlite-Abfrage gibt 0 zurück, auch wenn der Wert null ist

    "SELECT conn_status FROM profiles WHERE devID = '" + id+"'" 
    

    Wenn kein Wert für ‚conn_status‘ entsprechend der Devid vorgesehen, dann wird der vorhandene Wert in der Tabelle wäre null gespeichert ist. Ich Abrufen die Daten von Java, wie gezeigt:

    c.getInt(c.getColumnIndex("conn_status")) 
    

    Das Problem hier ist, mit der gegebenen Abfrage, c.getInt 0 zurück, auch wenn der Wert im Feld vorhandenen null ist. Wie kann ich diese Abfrage so ändern, dass sie einen anderen Wert als 0 zurückgibt, z. B. 5, wenn der Wert null ist.

    Jede Hilfe wird geschätzt.

    Antwort

    15

    Sie können die isNull()-Funktion verwenden. Hier ein Beispiel:

    static int getInt(String columnName) 
    { 
        if(c.isNull(c.getColumnIndex(columnName))) 
         return -1; 
        return c.getInt(c.getColumnIndex(columnName)); 
    } 
    
    +0

    Bessere Praxis Rückgabe Integer nicht primitive int und Rückgabe Null nicht -1 und Kontrolle Fehler im Modell. –

    3

    int in Java ein primitiver Datentyp ist und nicht null sein kann. Wenn also von Ihrem getInt kein Wert zurückgegeben wird, erhalten Sie 0. Das Integer-Objekt kann null sein, daher sollten Sie Integer anstelle von int verwenden, wenn Sie in Ihrer Logik Nullen anstelle von 0s

    16

    suchen müssen in SQLite können Sie die IFNULL Funktion NULL Werte ersetzen:

    SELECT IFNULL(conn_status, 5) FROM profiles WHERE devID = ? 
    
    0

    in Android verwenden Integer-Objekt nicht primitive int, ist Integer nullable, primitive int Ursache Ausnahme. Überprüfen Sie in Model, ob der Wert null ist, oder verarbeiten Sie den Inhalt.

    /** 
    * Return real integer of value or null 
    * @param column_name Name of column in result 
    */ 
    public Integer getInt(String column_name){ 
        try{ 
         if(cursor.isNull(cursor.getColumnIndex(column_name))) 
          return null; 
         return cursor.getInt(cursor.getColumnIndex(column_name)); 
        }catch(Exception e){ 
         e.printStackTrace(); 
         Log.e("sqlite_exception", "column " + column_name + " not exists. " + e.getMessage()); 
         return null; 
        } 
    } 
    
    0

    Sie können feststellen, ob die Spalte null ist, indem Sie getType() aufrufen.

    2

    Da Sie einen anderen Wert wie 5 wünschen, wenn die Spalte einen Nullwert hat, versuchen Sie den folgenden Code.

    Cursor c = db.rawQuery("SELECT conn_status FROM profiles WHERE devID = '" + id+"'"); 
    
        if(c.getCount>0){ 
        int number = c.getInt(c.getColumnIndex(conn_status)); 
        return number; 
        }else{ 
        return 5; 
        } 
    

    Wenn cursor.getCount() return etwas bedeutet Abfrage arbeiten und Datenbank nicht Nullwert. Wenn Rückgabe entgegengesetzt bedeutet Abfrage nicht arbeiten und Datenbank mit Null-Wert für die jeweilige Abfrage. Also probier es mal.

    0

    hatte ich das gleiche Problem mit einem NULL Wert angeblich 0 in einem c.getInt(index) Anruf zurück.

    Es stellt sich heraus, dass meine Datenbank einen Textwert vonnull hatte. Das heißt, anstelle eines 0-Byte-Werts von NULL gab es 4 Zeichen 'n' 'u' 'l' 'l'. Das ist verwirrend, weil null richtig aussieht. Ich habe es nicht verstanden, bis ich die DB mit einem SQLite DB Browser überprüft habe.

    Als ich diese Textwerte ersetzte, funktionierten die Dinge wie erwartet.

    Ich weiß, dass dies eine alte Frage ist, aber hoffentlich wird dies jemand anderem etwas Zeit zur Fehlersuche sparen.

     Verwandte Themen

    • Keine verwandten Themen^_^