Ошибка пустого курсора Sqlite?
Обычно этот код работает очень хорошо. Но если "курсор" пуст, то в нем есть ошибка. main.class. Я много чего перепробовал. Но мне это не удалось. Пожалуйста, помогите решить этот вопрос.
---- database.class ----
public List<Integer> count_a() { List<Integer> list = new ArrayList<Integer>(); String selectQuery = "select book, count(date) from myTAB WHERE (date>'" + 0 + "') group by book"; // if result is empty, there is an error in main.class. SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); if (cursor.moveToFirst()) { do { list.add(Integer.parseInt(cursor.getString(1))); } while (cursor.moveToNext()); } cursor.close(); db.close(); return list; }
---- main.class ----
private void load_data() { Database db = new Database(getApplicationContext()); List<Integer> co_a = db.count_a(); // error is here Integer[] co_b = new Integer[co_a.size()]; co_b = co_a.toArray(co_b); List_Row adapter = new List_Row(this, co_b); ListView lv = (ListView) findViewById(R.id.lvStat); lv.setAdapter(adapter); }
Что я уже пробовал:
Неудача 1
if (cursor.moveToFirst()) { do { if (cursor.getCount() == 0 || cursor == null) { list.add(0); } else { list.add(Integer.parseInt(cursor.getString(1))); } } while (cursor.moveToNext()); }
Отказ 2
if (cursor.moveToFirst()) { do { if(cursor.getCount() == 0){ list.add(0); }else { list.add(Integer.parseInt(cursor.getString(1))); } } while (cursor.moveToNext()); }
Неудача 3
if (cursor != null && cursor.moveToFirst()) { do { if (cursor.getCount() > 0) { list.add(Integer.parseInt(cursor.getString(1))); } else { list.add(0); } } while (cursor.moveToNext()); }
Неудача 4
if (cursor.moveToFirst()) { do { if (cursor != null && cursor.getCount() > 0) { list.add(Integer.parseInt(cursor.getString(1))); } else { list.add(0); } } while (cursor.moveToNext()); }
Неудача 5
if (cursor.moveToFirst()) { do { list.add(Integer.parseInt(cursor.getString(1))); } while (cursor.moveToNext()); } if (cursor.isBeforeFirst()){ do { list.add(0); } while (cursor.moveToNext()); }
Peter Leow
Что вы подразумеваете под "нормально, этот код работает очень хорошо"? Что такое сообщение об ошибке? Откуда вы знаете,что это связано с пустым курсором? SelectQuery не кажется правильным.
Richard Deeming
НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]
Richard Deeming
И если вы хотите, чтобы кто-то помог вам исправить ошибку, то вам нужно сообщить нам подробности этой ошибки!