Функция SQLiteDatabase close () вызывает NullPointerException при использовании нескольких streamов

В моем проекте я обнаружил, что функция close () в реализации SQLiteDatabase на Android генерирует исключение NullPointerException при запуске нескольких streamов, которые открывают базу данных, вставляют данные и затем закрывают базу данных. Все работает гладко, если я не разрешаю каждому streamу закрывать () после вставки в базу данных.

Вот пример того, как будет выглядеть один из streamов писем

ContentValues values = new ContentValues(); values.put(CallDetailsStorageConstants.COLUMN_NAME_REMOTE_NAME_IDX, (String) ""); values.put(CallDetailsStorageConstants.COLUMN_NAME_REMOTE_MEETINGID_IDX, (String) ""); CalculonDatabase callDetailsOpenHelper = CalculonDatabase.getInstance(mContext); SQLiteDatabase dbw = callDetailsOpenHelper.getWritableDatabase(); long rowid = 0; try { rowid = dbw.insertWithOnConflict(CallDetailsTable.CALL_DETAILS_TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE); } catch (SQLiteConstraintException e) { e.printStackTrace(); } finally { dbw.close(); } 

Вы можете видеть, что в конце делается вызов close (). При запуске нескольких streamов я получаю это исключение.

 11-03 03:39:26.128: E/AndroidRuntime(977): FATAL EXCEPTION: Thread-17 11-03 03:39:26.128: E/AndroidRuntime(977): java.lang.NullPointerException 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.releaseAndUnlock(SQLiteStatement.java:283) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:96) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1933) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1864) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:636) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:551) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:240) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:111) 11-03 03:39:26.128: E/AndroidRuntime(977): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1737) 11-03 03:39:26.128: E/AndroidRuntime(977): at com.smash.DBWritingThread.run(DBWritingThread.java:50) 

Тогда возникает вопрос, почему эта ошибка возникает только при использовании функции close ()? Кроме того, хорошо ли использовать close () в гораздо более позднее время или, возможно, никогда?

Любые советы с этой проблемой очень ценятся.

4 Solutions collect form web for “Функция SQLiteDatabase close () вызывает NullPointerException при использовании нескольких streamов”

У меня есть ваши ответы!

Никогда не закрывайте дБ. Это так просто.

Убедитесь, что у вас есть только один, повторить, * один экземпляр Helper для каждого приложения. Поделитесь им со всеми темами.

http://www.touchlab.co/blog/single-sqlite-connection/

Вот еще информация о внутренних компонентах sqlite и блокировке:

http://www.touchlab.co/blog/android-sqlite-locking/

Вам не нужно беспокоиться. См. Это обсуждение, которое включает подтверждение того, что закрытие базы данных выполняется системой по мере необходимости, если / когда процесс уничтожается.

Соответствующая цитата из сотрудника Google:

Поставщик контента создается, когда его хостинг-процесс создается и остается вокруг до тех пор, пока процесс выполняется, поэтому нет необходимости закрывать базу данных – он будет закрыт, поскольку часть ядра очистит ресурсы процесса, когда процесс убит.

Если вы работаете непосредственно с базой данных SQLite, не обращаясь к поставщику контента, то шаблон, который я видел, используется для закрытия базы данных в Application.onTerminate , тогда как экземпляр Application хранит одноадресный «адаптер» базы данных, который будет представлять собой объект, содержащий SQLiteDatabase и его SQLiteOpenHelper .

Похож на эту проблему: функция SQLiteDatabase close () вызывает NullPointerException, когда несколько streamов

Вам может не потребоваться вызвать database.close ()

  • Как я могу объединить многие базы данных SQLite?
  • Как использовать регулярное выражение в SQLite-запросе?
  • Создать таблицу в SQLite только в том случае, если она уже не существует
  • Проблемы с использованием Entity Framework 6 и SQLite
  • Когда запускается SQLiteOpenHelper onCreate () / onUpgrade ()?
  • Как хранить и извлекать blob из sqlite
  • Ошибка Android - close () никогда не вызывалось явным образом в базе данных
  • Драйвер JDBC генерирует исключение «ResultSet Closed» на пустой ResultSet
  • Как преобразовать массив байтов в Bitmap
  • Плюсы и минусы SQLite и общих настроек
  • Удаление строки в SQLite на Android
  • Давайте будем гением компьютера.