Android использует механизм блокировки java для сериализации доступа к базе данных SQLite. Таким образом, если у нескольких потоков есть один экземпляр базы данных, он всегда обращается к базе данных сериализованным образом и, конечно, база данных является поточно-безопасной .
Если мы подтвердим, что мы используем базу данных из одного потока, у нас была возможность отключить внутреннюю блокировку базы данных, вызвав setLockingEnable(false)
, но этот метод получил устаревший с уровня API 16 и больше не используется. если вы увидите реализацию этого метода в SQLiteDatabase
классе, вы не найдете там ничего написанного, т.е. пустой метод.
public void setLockingEnabled (boolean lockingEnabled)
Этот метод теперь ничего не делает. Не использовать.
Одна вещь, о которой мы должны позаботиться, это то, что мы должны сделать один экземпляр вашего вспомогательного класса (т.е. сделать его одноэлементным) и совместно использовать один и тот же экземпляр для нескольких потоков и не вызывать close()
в базе данных между операциями, в противном случае Вы можете получить следующее исключение:
java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase
Таким образом, не вызывайте database.close()
между доступом к базе данных, база данных самостоятельно выполнит внутреннюю операцию закрытия, когда все операции будут завершены.