Android: получение данных из базы данных - PullRequest
2 голосов
/ 10 июля 2009

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

public String getEntry(long rowIndex){
    String value = "";

    Cursor c = db.query(DATABASE_TABLE, new String[] {KEY_NAME, VALUE}, KEY_NAME + "=" + rowIndex, null, null, null, null);
    int columnIndex = c.getColumnIndex(VALUE);
    int rowsCount = c.getCount();
    if(rowsCount > 0){
        String value = c.getString(columnIndex);
    }

    return value;
}

При отладке я вижу, что курсор c содержит два столбца и одну строку, но когда дело доходит до строки

String value = c.getString(columnIndex);

он выдает исключение CursorIndexOutOfBoundsException, хотя columnIndex = 1, которое должно указывать на действительную запись.

Кто-нибудь знает, что здесь может быть не так?

Ответы [ 3 ]

4 голосов
/ 10 июля 2009

Я не знаю ваш DB-Wrapper, который вы используете, но я хочу сделать два предположения, так как я немного знаю Sqlite.

Это может быть:

  1. В моей оболочке и в C-API необходимо делать шаг (или следующий шаг) каждый раз, когда вы хотите получить данные. Ваше исключение означает, что вы не находитесь в правом ряду. Таким образом, вы можете попробовать «следующий» или «шаг» (что всегда понимает ваш DB-Wrapper).

  2. Это c.getCount() также может принести неприятности. Что может сделать getCount, чтобы рассчитывать на курсор? Он может перебирать курсор, пока он не закончится. Когда это происходит, курсор исчерпан, и вы можете только повторить все это. Чтение в этот момент приведет к тому, что вы получили. Чтобы избежать проблемы без необходимости читать таблицу дважды, вам нужно просто прочитать все строки самостоятельно и выполнить подсчет самостоятельно. В вашем DB-Wrapper должны быть средства (например, исключения или статусы), где вы можете проверить, исчерпан ли ваш курсор.

Когда я правильно понял ваш DB-Wrapper, одна из них могла быть проблемой.

2 голосов
/ 01 ноября 2010

У меня есть база данных, созданная ранее. У которой есть два имени поля, num.

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

 Cursor c=myDB.query(MY_DATABASE_TABLE,null,null,null,null,null,null);
  Log.d("cursor",Integer.toString(c.getCount()));

  if (c.moveToFirst())
 {

do{
       String data = c.getString(c.getColumnIndex("name"));

                  Log.v("yo",data);

               }while(c.moveToNext());

}

Ошибка - неверный запрос для слота поля 0, -1 число = 5, число столбцов = 2

2 голосов
/ 10 июля 2009

Вам нужно переместить курсор в первую строку с помощью c.moveToNext () перед чтением значения:

public String getEntry(long rowIndex) {
    String value = "";

    Cursor c = db.query(DATABASE_TABLE, new String[] { KEY_NAME, VALUE },
            KEY_NAME + "=" + rowIndex, null, null, null, null);

    int columnIndex = c.getColumnIndex(VALUE);
    if (c.moveToNext()) {
        value = c.getString(columnIndex);
    }

    return value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...