2013-04-11 5 views
5

ich ohne Erfolg die folgende Methode bin Ausführung beacause der selectArgs nicht mehr korrekt sind (zumindest ist es das, was ich glaube,NULL-Werte in Android Auswählen SQLite

findAll.

public Collection<Object> findAllByCodigoSetorOrderByStatusWhereDataAgendamentoIsNull(Integer vendedor) { 
    Collection<Object> objects = null; 
    String selection = Object.FIELDS[20] + "=?" + " OR " + Object.FIELDS[20] + "=?" + " OR " + Object.FIELDS[20] + "=?" + " AND " + Object.FIELDS[6] + "=?"; 
    String[] selectionArgs = new String[] { "''", "'null'", "NULL", String.valueOf(vendedor) }; 
    Collection<ContentValues> results = findAllObjects(Object.TABLE_NAME, selection, selectionArgs, Object.FIELDS, null, null, Object.FIELDS[4]); 
    objects = new ArrayList<Object>(); 
    for (ContentValues result : results) { 
     objects.add(new Object(result)); 
    } 
    return objects; 
} 

findAllObjects:

protected Collection<ContentValues> findAllObjects(String table, String selection, String[] selectionArgs, String[] columns, String groupBy, String having, String orderBy) { 
     Cursor cursor = null; 
     ContentValues contentValue = null; 
     Collection<ContentValues> contentValues = null; 
     try { 
      db = openRead(this.helper); 
      if (db != null) { 
       cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy); 
       contentValues = new ArrayList<ContentValues>(); 
       for (int i = 0; i < cursor.getCount(); i++) { 
        cursor.moveToPosition(i); 
        contentValue = new ContentValues(); 
        for (int c = 0; c < cursor.getColumnCount(); c++) { 
         contentValue.put(cursor.getColumnName(c), cursor.getString(c)); 
        } 
        contentValues.add(contentValue); 
        cursor.moveToNext(); 
       } 
      } 
      return contentValues; 
     } finally { 
      close(db); 
     } 
    } 

Wie kann ich auswählen und vergleichen Sie richtig eine Spalte - nul l, 'null' und '' mit der db.query?

+0

gehen Sie mit Ihren Daten mit einem 'Cursor' ? – Cornholio

+1

Bearbeitet, um die Frage klarer zu machen ... Danke für die Frage Cornholio. – MBarni

+0

Der einfachste Weg, um eine Zeile für einen Nullwert zu überprüfen, ist dies - 'if (cursor.isNull (cursor.getColumnIndex (" my_column ")) doStuff();'. Gibt es einen Grund, warum Sie das nicht verwenden können? – Cornholio

Antwort

11

Android Datenbank-API erlaubt nicht NULL Werte als Parameter übergeben; es erlaubt nur Zeichenfolgen. (Dies ist eine schreckliche Design-Fehler. Schlimmer noch, SQLiteStatementtut alle Arten von Parametern zu ermöglichen, funktioniert aber nur für Abfragen, die einen einzelnen Wert zurückgeben.)

Sie haben keine andere Wahl, als die Abfrage-String zu blah IS NULL zu ändern .

+0

Das sollte (ich hoffe schon) als Bug/Request auf Android-Listen markiert sein. – MBarni

+0

Die 'ist Null' Notwendigkeit ist traditionelle SQL-Syntax. '= null' liefert keine Ergebnisse in _irgendein_ SQL-Datenbankverwaltungssystem. Und es macht auch keinen Sinn, dafür ein Argument zu verwenden. Zum einen, weil die Syntax anders ist und zum anderen, weil Sie immer den gleichen String verwenden. In Ihrem Fall würde ich die Argumentsubstitution * nur für die Variable vendedor * verwenden. Für diese anderen - Festwerte wird es einfach nicht benötigt und somit eine Verschwendung von CPU-Zyklen und Akkulaufzeit (wenn auch nur geringfügig).Sie sind nur nützlich, wenn die Argumente Variablenwerte wie für Ihr letztes Argument enthalten können. –

+1

@ CL. Tatsächlich ist SQLiteStatement eine schreckliche Klasse. Grenzen der Nutzlosigkeit. –

0

Alte Frage, aber ich war immer noch auf ein paar Stunden fest, bis ich diese Antwort gefunden habe. Aus welchem ​​Grund dieses seltsame Verhalten (oder Fehler) noch existiert im android sdk, wenn Sie gegen null-Werte abfragen wollen einfach

SQLiteDatabase db = getReadableDatabase(); 
ContentValues contentValues = new ContentValues(); 

contentValues.put("columnName", newValue); 

String nullSelection = "columnName" + " IS NULL"; 

db.update("tableName", contentValues, nullSelection, null); 
db.close(); 

In diesem Beispiel tun i-Werte am aktualisieren, aber es ist ein ähnliches Konzept, wenn nur Werte auswählen

0

Wie in anderen Antworten erwähnt, muss für Null "IS NULL" verwendet werden. Hier finden Sie einige Komfort-Code für beide null und Zeichenfolgen haben (ich verwende im Beispiel löschen, aber das gleiche gilt für andere Methoden, zB Abfrage durchgeführt werden):

public void deleteSomething(String param1, String param2, String param3) { 
    ArrayList<String> queryParams = new ArrayList<>(); 

    mDb.delete(TABLE_NAME, 
      COLUMN_A + getNullSafeComparison(param1, queryParams) + "AND " + 
        COLUMN_B + getNullSafeComparison(param2, queryParams) + "AND " + 
        COLUMN_C + getNullSafeComparison(param3, queryParams), 
      queryParams.toArray(new String[0])); 
} 

private String getNullSafeComparison(String param, List<String> queryParams) { 
    if (param == null) { 
     return " IS NULL "; 
    } else { 
     queryParams.add(param); 
     return " = ? "; 
    } 
}