2013-05-30 1 views
0

Я запросы к базе данных с помощью следующего запроса:CursorIndexOutOfBoundsException для таблицы и запись существующей

final Cursor subject_cursor = db.rawQuery("SELECT * FROM " + DB.Table.SUBJECT + " WHERE uniqueSUB = '" + cs_cursor.getString(1) + "'", null); 

, когда я войти подсчитывать курсор это дает мне-как кол, но когда я пытаюсь получить доступ к данным с помощью subject_cursor.getString (0) это дает мне ошибку говоря:

05-30 03:37:10.921: W/System.err(5408): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 

Я проверил базу данных для записи вручную, так и все необходимые данные присутствуют. (Кроме того, если я просто сделать следующий запрос:

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

Пожалуйста Помогают ...

+0

Тогда есть вероятность того, что ваш запрос не будет выполнен правильно. Каково значение 'cs_cursor.getString (1)' только для выполнения запроса? –

+0

@Shobhit Puri это 2 – 7bluephoenix

+0

@ShobhitPuri Я проверил и подтвердил это !!!! – 7bluephoenix

ответ

2

Обязательно прочитайте весь пост Cursor Index Out of Bounds Exception. Он касается точно такой же проблемы, и вы можете получить ответ на свою проблему. Взяв с поста и добавив к тому, что указал @Alexey, Cursors - lazy loaded, и вам нужно позвонить moveToFirst() или moveToPosition() и т. Д., Чтобы загрузить их в память. moveToFirst перемещает курсор в первую строку, чтобы вы могли получить к нему доступ. Аналогично, moveToPosition() перемещает курсор в абсолютное положение. Без использования этих функций он выдает ошибку, которую вы получаете. Надеюсь это поможет.

+0

если курсоры ленивы загружены, то почему я получаю имя столбца, если я это делаю: subject_cursor.getColumnName (0); – 7bluephoenix

+1

[getColumnName] (http://developer.android.com/reference/android/database/Cursor.html#getColumnName%28int%29) возвращает имя столбца при заданном индексе столбца с нулевым значением. Это не зависит от ваших строк, которые вы получаете как результат запроса. Так что это сработает. –

+0

поэтому после того, как я запрошу предложение where, а затем используйте moveToFirst или moveToPosition, чтобы получить нужную запись, мне придется снова запросить таблицу с предложением where .... не так ли ??? – 7bluephoenix

1
if(subject_cursor.moveToFirst()) 
    subject_cursor.getString(0); 
+0

Что такое предложение WHERE, если я просто перевежу его в первую запись ??? : -/ – 7bluephoenix

+0

ok .... я просто нуждался в меня, чтобы объяснить курсор ленивой загрузки вещи ... ShobhitPuri помог мне с этим ... спасибо за ответ – 7bluephoenix

0

Изменить код для

final Cursor subject_cursor = db.rawQuery("SELECT * FROM " + DB.Table.SUBJECT + " WHERE uniqueSUB = '" + cs_cursor.getString(0) + "'", null); 

Поскольку у вас есть только 1 строку в таблице, и ваши пытаются извлечь 2-ой строки с помощью cs_cursor.getString(1)

Попробуйте этот код,

public void getAllEvents() { 



    // Select All Query 
    String selectQuery = "SELECT * FROM " + TABLE_EVENTS; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 

    // looping through all rows and adding to list 
    if (cursor.moveToFirst()) { 
     do { 




      // Adding contact to list 
      MainActivity.Id.add(cursor.getString(0)); //it will store id to my array list "Id" 


     } while (cursor.moveToNext()); 
    } 


} 
+0

Я ... я даже попробовал, чтобы просто получить то же самое ошибка! – 7bluephoenix

+0

см. Мой отредактированный ответ –

+0

какая вторая строка ?? что cs_cursor для другой таблицы, у которой есть достоверные данные (я подтвердил) ... и рассчитываю, что после того, как вышеупомянутый запрос для второй таблицы равен 1 .... поэтому я нахожу запись ... просто я не могу получить он использует subject_cursor.getString (0). – 7bluephoenix