У меня ОЧЕНЬ базовая универсальная функция, которая получает для меня количество таблиц.Прежде чем кто-либо скажет что-нибудь о безопасности и оптимизации, это для небольшого приложения Android с локальной базой данных для устройства, и любая таблица будет иметь 1-100 строк.
public int getCount() {
if (!database.isOpen()) {
open();
}
String sql = "SELECT * FROM debt";
Cursor c = database.rawQuery(sql, null);
int count = c.getCount(); // the line in question
c.close();
return count;
}
Я получаю следующее исключениена устройстве Android 8.0:
Caused by: android.database.sqlite.SQLiteException:
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow (Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow (SQLiteConnection.java:851)
at android.database.sqlite.SQLiteSession.executeForCursorWindow (SQLiteSession.java:974)
at android.database.sqlite.SQLiteQuery.fillWindow (SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow (SQLiteCursor.java:143)
at android.database.sqlite.SQLiteCursor.getCount (SQLiteCursor.java:132)
at android.database.AbstractCursor.moveToPosition (AbstractCursor.java:219)
at android.database.AbstractCursor.moveToNext (AbstractCursor.java:268)
at com.---.---.database.GasDataSource.getAllGasSpent (GasDataSource.java:171)
at com.---.---.GasUtil.getUsedLastMonth (GasUtil.java:94)
at com.---.---.DashboardFragment.onActivityCreated (DashboardFragment.java:88)
at android.support.v4.app.Fragment.performActivityCreated (Fragment.java:2355)
at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1451)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1827)
at android.support.v4.app.BackStackRecord.executeOps (BackStackRecord.java:797)
at android.support.v4.app.FragmentManagerImpl.executeOps (FragmentManager.java:2596)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether (FragmentManager.java:2383)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManager.java:2338)
at android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:2245)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange (FragmentManager.java:3248)
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated (FragmentManager.java:3200)
at android.support.v4.app.FragmentController.dispatchActivityCreated (FragmentController.java:195)
at android.support.v4.app.FragmentActivity.onStart (FragmentActivity.java:597)
at android.support.v7.app.AppCompatActivity.onStart (AppCompatActivity.java:177)
at android.app.Instrumentation.callActivityOnStart (Instrumentation.java:1334)
at android.app.Activity.performStart (Activity.java:6997)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2838)
По какой-либо причине в эти дни по какой-то причине в стеках Play Console нет особых сообщений об исключениях.Просто универсальное исключение SQLiteException.
Когда этот код вызывается, я на 99% уверен, что таблица всегда будет существовать (в моем опыте никогда не скажешь 100%).Я не знаю, что еще может пойти не так здесь.Это, конечно, не будет делать это, если таблица пуста.Я хотел бы знать, что еще может пойти не так, что может вызвать исключение?
(Если кто-то не может помочь себе и может просто придумать лучший способ написать это, чтобы избежать исключения, я тоже весь в ушах; я думаю, что попытка / отловить - самый последний вариант здесь)