Безопасно ли выполнять чтение / запись БД из блока `launch` внутри onCreate действия? - PullRequest
1 голос
/ 23 октября 2019

Мое приложение для Android рушится в работе с различными исключениями, такими как IllegalStateException, SQLiteDiskIOException, SQLiteCantOpenDatabaseException и т. Д., Когда я пытаюсь получить доступ к БД из сопрограммы launch (создал новый CoroutineScope для этого типа ioCoroutineContext + SupervisorJob()) блок.

Здоров ли доступ к БД из такого блока launch? Кроме того, поскольку это первый доступ к БД в приложении, он будет выполнять миграцию БД, если таковая имеется.

Ответы [ 2 ]

5 голосов
/ 23 октября 2019

Для операций с базой данных я считаю, что лучше использовать асинхронный режим с потоком по умолчанию или потоком ввода-вывода.

Например, я работал над приложением, в котором я выполнял операции db sqlite в держателе представления связывания реселлера с режимом запуска в режиме Main. Поток как сопрограммы однако, делая это, мое представление переработчика сильно отставало, поэтому вместо использования запуска я перешел к асинхронности в Потоке по умолчанию для операций с БД, что также привело к повышению производительности.

Согласно ответу @MarkoTopolnik, я согласенс ним полностью, и в вашем случае может возникнуть проблема с многопоточностью при работе с sqlite, вам нужно быть точным в том, как все выполняется на самом деле.

2 голосов
/ 23 октября 2019

Я думаю, что ваша настоящая проблема - это гонка между кодом, который вы выполняете внутри launch, и кодом, который вы выполняете в основном потоке. Может случиться так, что один кодовый путь выполняет инициализацию соединения с БД, а другой использует это соединение, и проблема в том, что они параллельны. Возможно также, что вы выполняете какой-то незаконный многопоточный доступ к клиенту БД.

Доступ к БД из блока launch ed сам по себе не является ошибкой.

...