У меня есть запрос SQLite в моем приложении для Android, который кажется сбой, когда он выполняется слишком долго. Вылетает с NullPointerException и сообщает мне номер строки ...
Когда я ставлю точки останова вокруг этой строки и вижу, что она всегда заполняется переменной, приложение не падает и делает то, что должно.
Таким образом, помимо наличия фантомного нулевого указателя, проблема состоит в том, что точки останова на самом деле замедляют работу, давая время для выполнения запроса. Без точек останова всегда происходит сбой.
Другие здесь, похоже, имеют аналогичную проблему, и я читал некоторые вещи о том, что SQLite тратит много времени на выполнение задач, но в этой таблице должно быть всего несколько записей (ту, которую я тестирую) должно иметь только три записи, 4 столбца)
Предложения о том, как сделать так, чтобы он не падал? Возможно, поместить ожидание потока в метод, который делает запрос?
public void fetchItemsToRemove() throws SQLException{
Cursor mCursor =
mapDb.query(myMain_TABLE, new String[] {myOtherId, myCustomID, myDATE}, null, null, null, null, null);
if(mCursor.moveToFirst())
{
do
{
/*taking "dates" that were stored as plain text strings, and converting them to
*Date objects in a particular format for comparison*/
String DateCompareOld = mCursor.getString(mCursor.getColumnIndex(myDATE));
String DateCompareCurrent = "";
Date newDate = new Date();
DateCompareCurrent = newDate.toString();
try {
DateCompareOld = (String)DateCompareOld.subSequence(0, 10);
DateCompareCurrent = (String)DateCompareCurrent.subSequence(0, 10);
SimpleDateFormat dateType = new SimpleDateFormat("EEE MMM dd");
Date convertDate = dateType.parse(DateCompareOld);
newDate = dateType.parse(DateCompareCurrent);
if(convertDate.compareTo(newDate) < 0)
{
//remove unlim id
mapDb.delete(myMain_TABLE, myDATE + "=" + mCursor.getString(mCursor.getColumnIndex(myDATE)), null);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}while(mCursor.moveToNext());
mCursor.close();
}
else
{
mCursor.close();
}
}
Теперь "строка 342", где происходит сбой с NullPointerException, равна DateCompareOld = (String)DateCompareOld.subSequence(0, 10);
, где она получает подпоследовательность строки. Если он попадает сюда и имеет значение null, это означает, что строка никогда не была заполнена в String DateCompareOld = mCursor.getString(mCursor.getColumnIndex(myDATE));
как будто запрос только что был пропущен, потому что это заняло слишком много времени. Обратите внимание, что это время цикла, и я провел тесты, чтобы убедиться, что mCursor никогда не выходит за пределы.