CursorIndexOutOfBoundException: индекс 1 запрошен, с размером 1 - PullRequest
3 голосов
/ 27 июля 2011

это снова я, у меня проблемы с sqlite для Android

В настоящее время я получаю запрос "CursorIndexOutOfBoundsException: индекс 1, с размером 1". Однако у меня было это исключение с индексом -1, тогдавставил cursor.moveToFirst(), тогда у меня было это с индексом 0, затем сделал cursor.moveToNext(); Что я хочу сделать с моим кодом?Я хочу получить информацию о выбранном элементе (вот почему там присутствуют selectionArgs с sQueryid. Что я делаю не так?

    Cursor c = a.managedQuery(uri, 
            projection, //projection
            "_ID=?", //selection string
            new String[]{sQueryid}, //selection args array of strings
            DepotTableMetaData.DEFAULT_SORT_ORDER); //sort order
    c.moveToFirst();
    c.moveToNext();
    int iqrcode = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_QRCODE);     
    int iname = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_NAME);
    int iamount = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT);
    int iunit = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_UNIT);
    int ippu = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_PPU);
    int itotal = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_TOTAL);
    int icomment = c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_COMMENT);


        //Gather values
        String id = c.getString(Integer.parseInt(queryid.toString()));

        String name = c.getString(iname);
        String amount = c.getString(iamount);
        String unit = c.getString(iunit);
        String ppu = c.getString(ippu);
        String total = c.getString(itotal);
        String comment = c.getString(icomment);
        String qrcode = c.getString(iqrcode);

        String[] info = new String[]{id,name,amount,unit,ppu,total,comment,qrcode};

Ответы [ 4 ]

12 голосов
/ 27 июля 2011

moveToFirst приводит вас к первому (и единственному) результату.Следующий вызов moveToNext приведет вас ко второму результату (индекс 1), который не существует.

Попробуйте удалить c.moveToNext();

1 голос
/ 27 июля 2011

Переместите cursor.moveToFirst(); и вот вы здесь. Поскольку moveToFirst() берет указатель курсора на первую запись и это то, что вам нужно. Не делайте moveToNext() после того, как вы сделали moveToFirst(), как вы сделали во фрагменте.

0 голосов
/ 16 апреля 2017

Я перестал получать эту проблему после того, как начал кодировать это так

if (c != null ) {
    Cursor c = sql.rawQuery("SELECT...");
    c.moveToFirst();
    for (int i = 0; i < c.getCount(); i++) {
        //do something
    c.moveToNext();
    }
}
0 голосов
/ 27 июля 2011

Вам необходимо включить больше информации в свой пост; код показывает переменные, которые используются, но мы не знаем, что это такое (uri, project, sQueryid и т. д.). У вас есть sQueryid String, а также вы пытаетесь отправить значение String переменной с именем queryid в метод parseInt - это те же переменные с опечаткой? Если нет, попробуйте использовать альтернативное наименование, чтобы оно не вызывало путаницы.

Мы также не можем видеть, в каком методе находится этот код; Вы упоминаете, что у вас возникают проблемы при нажатии на ListView, но где находится код? Если это так, то вызовы moveToFirst () и / или moveToNext () для вашего курсора - это не то, что вам нужно, и вы бы не получили курсор, вызвав функцию managedQuery. Вместо этого вы хотите использовать информацию о положении, переданную методу и адаптеру ListView. Немного больше вашего кода, я мог бы привести пример.

Если вы просто пытаетесь перебрать все строки в вашем запросе курсора, вы, вероятно, захотите сделать что-то вроде этого:

while (c.moveToNext()) {
    String name = c.getString(c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_NAME));
    String amount = c.getString(c.getColumnIndex(ContentProviderMetaData.DepotTableMetaData.ITEM_AMOUNT));
    // ...
    // do something with the data for this row
}

Редактировать (в соответствии с кодом, указанным в вашем комментарии):

Я думаю, что ваша проблема связана с идентификатором, который вы передаете парню ShowActivity. В вашем классе ShowActivity создайте переменную уровня класса для вашего Cursor, который вы используете для SimpleCursorAdapter для ListView, чтобы вы могли получить к нему доступ другими методами. Итак, что-то вроде:

public class ShowActivity extends ListActivity implements OnItemClickListener {
    Cursor mCursor;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        mCursor = managedQuery(ContentProviderMetaData.DepotTableMetaData.CONTENT_URI, projection, null, null, ContentProviderMetaData.DepotTableMetaData.DEFAULT_SORT_ORDER);
        // ...
        SimpleCursorAdapter simpleadapter = new SimpleCursorAdapter(this,R.layout.list_entry, mCursor, columns, to);
        // ...

Тогда ваш onItemClick метод должен выглядеть примерно так:

public void onItemClick(AdapterView<?> adapterView, View target, int position, long id) {
    Log.d("ShowActivity", "clicked @ " + position);
    mCursor.moveToPosition(position);
    final String itemId = mCursor.getString(mCursor.getColumnIndex(ContactsContract.Contacts._ID));
    Intent openAdvanced = new Intent(ShowActivity.this,AdvancedViewActivity.class);
    openAdvanced.putExtra("ID", itemId);
    startActivity(openAdvanced);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...