CursorIndexOutOfBoundsException в Android SQLite

Я делаю приложение с использованием sqlite, который вставляет, обновляет базу данных. Пока не вставлять и обновлять db. приложение выбрало исключение CursorIndexOutOfBoundsException. Я знаю, что это о курсоре. Есть ли кто-нибудь, кто может мне помочь?

public void EntryGiris(int yilsql, String aysql, int bakicisql,
        int krediArabasql, int krediOgrenimsql, int krediTatilsql,
        int faturaElektriksql, int faturaSusql, int faturaInternetsql,
        int aidatsql, int kaskoSigortasql) {

    ContentValues cv = new ContentValues();
    cv.put(C_YIL, yilsql);
    cv.put(C_AY, aysql);
    cv.put(C_BAKICI, bakicisql);
    cv.put(C_KREDIARABA, krediArabasql);
    cv.put(C_KREDIOGRENIM, krediOgrenimsql);
    cv.put(C_KREDITATIL, krediTatilsql);
    cv.put(C_FATURAELEKTRIK, faturaElektriksql);
    cv.put(C_FATURASU, faturaSusql);
    cv.put(C_FATURAINTERNET, faturaInternetsql);
    cv.put(C_AIDAT, aidatsql);
    cv.put(C_KASKOSIGORTA, kaskoSigortasql);

    String[] selectionArgs=new String[]{yilsql+"", aysql};
    String entryGirisSQL="SELECT c_id FROM harcamalar WHERE "+C_YIL+"= ? AND "+C_AY+"= ?";
    Cursor cursor=ourDatabase.rawQuery(entryGirisSQL, selectionArgs);
    cursor.moveToFirst();
    if(cursor.moveToLast()){
        int index=cursor.getInt(cursor.getColumnIndex(C_ID));
        if(index>=0)
            ourDatabase.update(DB_TABLE, cv, C_ID+"="+index, null);
        else ourDatabase.insert(DB_TABLE, null, cv);
    }

}

здесь есть исключение:

12-28 10:59:11.967: E/AndroidRuntime(317): FATAL EXCEPTION: main
12-28 10:59:11.967: E/AndroidRuntime(317): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.deitel.btc.TemporaryDatabase.EntryGiris(TemporaryDatabase.java:129)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.deitel.btc.Butcegiris$1.onClick(Butcegiris.java:59)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.view.View.performClick(View.java:2408)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.view.View$PerformClick.run(View.java:8816)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.os.Handler.handleCallback(Handler.java:587)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.os.Looper.loop(Looper.java:123)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-28 10:59:11.967: E/AndroidRuntime(317):  at java.lang.reflect.Method.invokeNative(Native Method)
12-28 10:59:11.967: E/AndroidRuntime(317):  at java.lang.reflect.Method.invoke(Method.java:521)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-28 10:59:11.967: E/AndroidRuntime(317):  at dalvik.system.NativeStart.main(Native Method)

ОК. ı сделал то, что вы сказали. Но после этого, когда приложение отладки ı оно выбрасывает это.

Thread [<1> main] (Suspended (exception CursorIndexOutOfBoundsException))   
    Butcegiris$1.onClick(View) line: 75 
    Button(View).performClick() line: 2408  
    View$PerformClick.run() line: 8816  
    ViewRoot(Handler).handleCallback(Message) line: 587 
    ViewRoot(Handler).dispatchMessage(Message) line: 92 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4627    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 521  
    ZygoteInit$MethodAndArgsCaller.run() line: 868  
    ZygoteInit.main(String[]) line: 626 
    NativeStart.main(String[]) line: not available [native method]  
0
nl ja de
ok, но ı хотите, чтобы курсор переместился в последнюю строку.
добавлено автор hopeTo, источник
@hopeTo затем используйте cursor.moveToLast (); он решит вашу проблему.
добавлено автор Dipak Keshariya, источник
cursor.moveToPosition (cursor.getCount() - 1); не нужен
добавлено автор Yahor10, источник

4 ответы

if(cursor.getCount() > 0) {
cursor.moveToPosition(cursor.getCount() - 1);
    Long index=cursor.getLong(cursor.getColumnIndex(C_ID));
    if(index>=0)
            ourDatabase.update(DB_TABLE, cv, C_ID+"="+index, null);
    else ourDatabase.insert(DB_TABLE, null, cv);

}
3
добавлено
ı сделал, но все равно такое же исключение. log выше
добавлено автор hopeTo, источник
хорошо. Спасибо.
добавлено автор hopeTo, источник
Возможно, вы должны сделать это: cursor.getLong (cursor.getColumnIndex (C_ID)); insted of cursor.getInt (cursor.getColumnIndex (C_ID));
добавлено автор gezimi005, источник
и изменить тип индекса на длинный
добавлено автор gezimi005, источник

В результате курсора из вашего запроса могут не быть никаких строк (результат пуст, как и ваш пример), ergo cursor.getCount() вернет 0 .

В этом случае вы хотите, чтобы элемент находился в индексе -1 , который всегда недействителен. Вместо ручной работы используйте встроенный < код> Cursor.moveToLast() -метод . Вы также можете проверить, есть ли там какие-либо результаты, поскольку этот метод возвращает false в противном случае:

Переместите курсор в последнюю строку.

     

Этот метод будет возвращать false, если курсор пуст .

0
добавлено
ı сделал, но все равно такое же исключение. log выше
добавлено автор hopeTo, источник

Тщательное чтение сообщений об ошибках показывает, что запрос не дал никаких результатов.

0
добавлено

Проблема здесь:

int index=cursor.getInt(cursor.getColumnIndex(C_ID));

-1 возвращается на

cursor.getColumnIndex(C_ID)

проверьте, создан ли C_ID.

0
добавлено
Я проверил и C_ID был создан ..
добавлено автор hopeTo, источник
Большое вам спасибо за помощь. я сделал это...
добавлено автор hopeTo, источник
могу ли я знать, чего вы пытаетесь достичь, выполнив int index = cursor.getInt (cursor.getColumnIndex (C_ID)); и зачем вам это нужно ???
добавлено автор preeya, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)