Запрос Sqlite, возвращающий 0, даже если значение null

Ниже приведен запрос, который я использую для получения значения int, соответствующего определенному полю в моей таблице sqlite db.

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

Если для «conn_status» не было сохранено значение, соответствующее предоставленному devID, тогда существующее значение в таблице будет равно NULL. Я извлекаю данные из java, как показано:

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

Проблема здесь в том, что с данным запросом c.getInt возвращает 0, даже если значение, существующее в поле, равно null. Как я могу изменить этот запрос так, чтобы он возвращал другое значение вместо 0, например 5, если значение равно null.

Любая помощь приветствуется.

Вы можете использовать isNull() . Вот пример:

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

В SQLite вы можете использовать функцию IFNULL для замены значений NULL :

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

int в Java является примитивным типом данных и не может быть null . Следовательно, если нет значения, возвращаемого вашим getInt, вы получите 0. Объект Integer может быть нулевым, поэтому вы можете захотеть использовать Integer вместо int, если ваша логика требует проверки нулей вместо 0

Поскольку вы хотите любое другое значение, например 5, если столбец имеет нулевое значение, попробуйте выполнить следующий код.

 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; } 

Если cursor.getCount () возвращает что-то, значит, работа запроса и база данных не имеют нулевого значения. Если обратное обращение противоположно, запрос не работает, а databse имеет нулевое значение для соответствующего запроса. Так что попробуйте один раз.

В Android используйте объект Integer не int primitive, Integer имеет значение NULL, примитивное int вызывает исключение. В модели проверьте, является ли значение нулевым или обрабатывает содержимое.

 /** * 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; } } 

Вы можете указать, является ли столбец нулевым, вызвав getType ().

 Integer locationInfoId; if (cursor.getType(columnIndex) == Cursor.FIELD_TYPE_NULL){ locationInfoId = null; } else { locationInfoId = cursor.getInt(columnIndex); } columnIndex++; 

У меня была такая же проблема с предположительно значением NULL возвращающим 0 в c.getInt(index) .

Оказывается, моя база данных имела текстовое значение null . То есть вместо 0-байтового значения NULL было 4 символа 'n' 'u' 'l' 'l' . Это сбивает с толку, потому что null выглядит корректно. Я не поймал его, пока не проверил БД с помощью SQLite DB Browser.

Когда я заменял эти текстовые значения, все работало, как ожидалось.

Я знаю, что это старый вопрос, но, надеюсь, это спасет кого-то еще некоторое время устранения неполадок.