Курсор не находит столбцы? - PullRequest
1 голос
/ 07 ноября 2010

Я пытался загрузить список значений из таблицы, но курсор не находит столбцы? Код, который глючит:

public final AccessToken[] fetchAccessTokenByServerId(final long serverId) {
    final Cursor c = db.query(
            ACCESS_TOKEN_TABLE,
            new String[] { ACCESS_TOKEN_COL_ID, ACCESS_TOKEN_COL_VALUE },
            ACCESS_TOKEN_COL_SERVER_ID + "=?",
            new String[] { Long.toString(serverId) },
            null,
            null,
            null);

    AccessToken[] result = new AccessToken[c.getCount()];
    for (int i = 0; i < result.length; i++) {
        long id = c.getLong(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_ID));
        String value = c.getString(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_VALUE));

        result[i] = new AccessToken(value, id, serverId);
        c.moveToNext();
    }
    return result;
}

public static final String COL_ID = "_id";
public static final String ACCESS_TOKEN_TABLE = "accesstoken";
public static final String ACCESS_TOKEN_COL_ID = COL_ID;
public static final String ACCESS_TOKEN_COL_SERVER_ID = "server_id";
public static final String ACCESS_TOKEN_COL_VALUE = "value";

Но первые два оператора в цикле for не выполняются:

Индекс -1 запрашивается, с размером 1

Таблица существует со столбцами: _id (= int), server_id (= int) и значением (= строка)

Есть одна запись: 1, 1, тест

Параметр функции равен 1.

С уважением xZise

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

Сразу после инициализации вашего курсора, сделайте следующее:

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

В этой части кода я рекомендую его следующим образом

Оригинал:

AccessToken[] result = new AccessToken[c.getCount()];
for (int i = 0; i < result.length; i++) {
    long id = c.getLong(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_ID));
    String value = c.getString(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_VALUE));

    result[i] = new AccessToken(value, id, serverId);
    c.moveToNext();
}

Изменено:

if (c.moveToFirst()){
   int rowCount = c.getCount();
   AccessToken[] result = new AccessToken(rowCount);
   int recCount = 0;
   while (!c.isAfterLast()){
        long id = c.getLong(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_ID));
        String value = c.getString(c.getColumnIndexOrThrow(ACCESS_TOKEN_COL_VALUE));

        result[recCount++] = new AccessToken(value, id, serverId);
        c.moveToNext();
   }
   c.close(); // <-- IMPORTANT!!!!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...