Ошибка в курсоре?

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Ошибка в курсоре?

Сообщение Zeban » 21 фев 2014, 17:01

Есть список, нажимаем на элемент. Он добавляется в корзину. При повторном нажатии нужно обновить количество элемента в корзине на единицу больше. Работает через раз, не могу понять логику ошибки. Вот код:

Код: Выделить всё

public void addRec(int id) {
      String query = "SELECT " + COLUMN_MENU_ID + ", "
    			+ COLUMN_MENU_NAME + ", "
    	    	    			+ COLUMN_MENU_SELL + ", "
    	    	    	    			+ COLUMN_MENU_IMG + " FROM " + DB_MENU_AP;
      Cursor cursor = myDataBaseJackie.rawQuery(query, null);
      cursor.moveToPosition(id-1);
    Cursor cd = myDataBaseJackie.query(DB_TRASH_AP, null, null, null, null, null, null);
    cd.moveToPosition(id-1);
//добавляем данные в корзину
      int item_id = cursor.getInt(cursor.getColumnIndex(COLUMN_MENU_ID));
      String item_name = cursor.getString(cursor.getColumnIndex(COLUMN_MENU_NAME));
      int item_sell = cursor.getInt(cursor.getColumnIndex(COLUMN_MENU_SELL));
      int item_img = cursor.getInt(cursor.getColumnIndex(COLUMN_MENU_IMG));
      ContentValues cv = new ContentValues();
      cv.put(COLUMN_TRASH_ID, item_id);
      cv.put(COLUMN_TRASH_NAME, item_name);
      cv.put(COLUMN_TRASH_KOL, 1);
      cv.put(COLUMN_TRASH_SELL, item_sell);
      cv.put(COLUMN_TRASH_IMG, item_img);
      long fail = myDataBaseJackie.insert(DB_TRASH_AP, null, cv);
//Обновляем количество элемента на единицу больше
      if (fail == -1){
    	  ContentValues cv1 = new ContentValues();
    	  int kol = cd.getInt(cd.getColumnIndex(COLUMN_TRASH_KOL))+1;
    	  cv1.put(COLUMN_TRASH_KOL, kol );
    	  myDataBaseJackie.update(DB_TRASH_AP, cv1, "_id = ?",
    	          new String[] { String.valueOf(id) });
      }
      cursor.close();
      cd.close();
    }
Ошибка в строке int kol = cd.getInt(cd.getColumnIndex(COLUMN_TRASH_KOL))+1; Я так понял какой то косяк с курсором. Лог говорит:

Код: Выделить всё

02-21 14:50:07.823: D/AndroidRuntime(364): Shutting down VM
02-21 14:50:07.823: W/dalvikvm(364): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-21 14:50:07.833: E/AndroidRuntime(364): FATAL EXCEPTION: main
02-21 14:50:07.833: E/AndroidRuntime(364): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at com.sunteam.jackie.DataBaseHelper.addRec(DataBaseHelper.java:169)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at com.sunteam.jackie.MySimpleCursorAdapter$1.onClick(MySimpleCursorAdapter.java:50)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.view.View.performClick(View.java:2485)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.view.View$PerformClick.run(View.java:9080)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.os.Handler.handleCallback(Handler.java:587)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.os.Handler.dispatchMessage(Handler.java:92)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.os.Looper.loop(Looper.java:123)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at java.lang.reflect.Method.invoke(Method.java:507)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-21 14:50:07.833: E/AndroidRuntime(364): 	at dalvik.system.NativeStart.main(Native Method)
Понял по этой строчке строчке
02-21 14:50:07.833: E/AndroidRuntime(364): android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1

Проблема вроде в том, что я пытаюсь обратиться к объекту, которого нет в массиве? Хотя я указываю точно на строку в базе cd.moveToPosition(id-1);
Это так? Как вылечить?
Если вы видите перед собой говно код, не удивляйтесь я начинающий) Очень надеюсь на помощь.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Ошибка в курсоре?

Сообщение Foenix » 21 фев 2014, 17:03

com.sunteam.jackie.MySimpleCursorAdapter$1.onClick(MySimpleCursorAdapter.java:50)
ошибка тут, а код показываешь другой.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Ошибка в курсоре?

Сообщение altwin » 21 фев 2014, 17:04

[syntax=java5]
if(cursor.moveToFirst() && cursor.getCount() >= 1){
do{
....
....

}while(cursor.moveToNext());
[/syntax]
или:
[syntax=java5]
if(cursor.getCount() >= 1){
while(cursor.moveToNext()){
....
....

}
[/syntax]
Изображение

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: Ошибка в курсоре?

Сообщение Zeban » 21 фев 2014, 17:08

Он работал без нареканий раньше.
Вот курсор:

Код: Выделить всё

class MySimpleCursorAdapter extends SimpleCursorAdapter { 
    Context ctx; 
    DataBaseHelper db;
    private static final String TAG = "myLogs";
    
    
    public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) { 
        super(context, layout, c, from, to, flags); 
        this.ctx=context; 

    } 


    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
    	
    	
        String name = cursor.getString(cursor.getColumnIndex(DataBaseHelper.COLUMN_MENU_NAME)); 
        String kol = cursor.getString(cursor.getColumnIndex(DataBaseHelper.COLUMN_MENU_KOL)); 
        String sell = cursor.getString(cursor.getColumnIndex(DataBaseHelper.COLUMN_MENU_SELL)); 
        TextView formname = (TextView) view.findViewById(R.id.text_hot); 
        TextView formkol=(TextView) view.findViewById(R.id.tvKol); 
        TextView formsell=(TextView) view.findViewById(R.id.tvSell); 
        formname.setText(name); 
        formkol.setText(kol + " гр"); 
        formsell.setText(sell + " р"); 
        Button yourButton = (Button) view.findViewById(R.id.btn_cont_callme); 
        yourButton.setOnClickListener( new View.OnClickListener() {
        	@Override
            public void onClick(View view) {
            if(view != null) {
                Object obj = view.getTag();
                if(obj != null && obj instanceof Integer) {
                	// открываем подключение к БД
                	db = new DataBaseHelper(null);
                    db.openDataBase();
                     Toast.makeText(ctx,"Блюдо добавленно в корзину", Toast.LENGTH_SHORT).show();
                     db.addRec(((Integer)obj).intValue());
                     db.close();
                     }
                }
            }
        	});
        
        Object obj = cursor.getInt(cursor.getColumnIndex("_id"));
        yourButton.setTag(obj);
    } 
    
} 

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: Ошибка в курсоре?

Сообщение Zeban » 21 фев 2014, 17:09

строка 50 это как раз вызов функции db.addRec(((Integer)obj).intValue());

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: Ошибка в курсоре?

Сообщение Zeban » 21 фев 2014, 17:17

altwin писал(а):[syntax=java5]
if(cursor.moveToFirst() && cursor.getCount() >= 1){
do{
....
....

}while(cursor.moveToNext());
[/syntax]
или:
[syntax=java5]
if(cursor.getCount() >= 1){
while(cursor.moveToNext()){
....
....

}
[/syntax]
Второй способ сработал, спасибо.

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: Ошибка в курсоре?

Сообщение Zeban » 21 фев 2014, 17:19

Правда я совсем не догоняю как, и почему была ошибка, а так же как исправилась. Буду думать и разбирать

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Ошибка в курсоре?

Сообщение Foenix » 21 фев 2014, 19:34

Zeban писал(а):строка 50 это как раз вызов функции db.addRec(((Integer)obj).intValue());
если бы это было так (ошибка во вложенном коде) то в логе тоже был бы адрес метода addrect
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Ошибка в курсоре?

Сообщение altwin » 21 фев 2014, 22:34

Zeban писал(а):Правда я совсем не догоняю как, и почему была ошибка, а так же как исправилась. Буду думать и разбирать
все просто вы используете moveToPosition(id-1); если целостность базы нарушенна, к примеру какая -то строка была удалена, порядок id не меняется, а просто что то пропущенно, таким образом вы получаете null. moveToNext просто идет к слудющему. По сути оба те варрианта делают одно и тоже, просто более безопастно с точки зрения обращения к null.

P.S. код я не смотрел, в любом случае -это первое, что стоит проверять если получаете CursorIndexOutOfBoundsException.
Изображение

Ответить