2016-05-18 2 views
0

У меня есть этот метод:приложение падает с cursor.getInt()

public String givenCheckmark(String name, String date) 
{ 
    SQLiteDatabase db = Cache.openDatabase(); 
    Cursor cursor = db.rawQuery("select value from checkmarks where timestamp ='"+date+"' and habit ='"+name+"'", null); 

    String habitValue = ""; 
    cursor.moveToFirst(); 
    if (!(cursor == null)) { 
     habitValue = Integer.toString(cursor.getInt(0)); 
    } 

    cursor.close(); 
    return habitValue; 
} 

по какой-то причине, если я удалить

habitValue = Integer.toString(cursor.getInt(0)); 

приложение не врезаться. поэтому проблема должна быть в курсоре.getInt (0). Запрос возвращает только одну строку. Я предполагаю, что курсор не в первой строке, но ... почему?

+0

Какая ошибка вы получаете от компилятора? – ScarletMerlin

+0

Прошу прощения, я забыл сказать это. Компилятор не показывает ошибку. Но сбой приложения –

+0

Проверьте, не является ли ваш Cursor.getInt (0) NULL. я предполагаю, что ваша база данных не возвращает значение. – ScarletMerlin

ответ

2

Наиболее вероятной причиной является элемент в индексе «0», а не целое число. Другая причина заключается в том, что сам Курсор может быть пустым. Наконец, вы, вероятно, должны проверить, действительно ли вернулось значение.

Чтобы обратиться к первой части, вам нужно использовать Cursor#getColumnIndex(), чтобы получить индекс столбца, который вы пытаетесь получить. Так что если это «идентификатор» вы хотите, то вы могли бы сделать:

int id = cursor.getInt(cursor.getColumnIndex("id"));

Для решения второй части, вам необходимо убедиться, что там были результаты возвращаются. Для этого достаточно проверить Cursor#getCount(). Итак:

boolean isEmpty = cursor.getCount() == 0;

В качестве альтернативы, возвращаемое значение для Cursor#moveToFirst() будет фактически возвращать false если курсор пуст означает, что вы можете получить значение, используя что-то вроде этого:

if (cursor != null && cursor.moveToFirst()) { 
    // The cursor is not null and contains elements. Continue retrieving values. 
} 

Для третьей части, вы можете использовать Cursor#isNull(), чтобы проверить, есть ли значение по данному индексу. Так что-то вроде этого:

boolean doesNotHaveValue = cursor.isNull(cursor.getColumnIndex("id"));

Другие проблемы я вижу здесь вы проверяете, если курсор находится нуль после перемещения его в первый индекс означает, что вы получите NullPointerException независимо от Wether или не указатель был пустым. Вы также закрываете курсор независимо от того, является ли он нулевым.

+0

Я не понимаю разницы между второй и третьей частью. Также, конечно, это целое число –

+0

Курсор указывает на определенную строку. «getCount()» сообщает вам, сколько строк есть. Если строк нет, то результатов не было. «isNull()» сообщает вам, является ли конкретный индекс (столбец) текущей строки нулевым. – DeeV

+0

И я вижу, что вы только получаете столбец «значение» из таблицы, так что это нормально, так как это будет единственное, что вернулось. Обычно, когда вы делаете запросы, у вас много строк и много столбцов, и нет гарантии, в каком порядке они появляются. – DeeV

Смежные вопросы