1. Провайдеры контента небезопасны для потоков
По умолчанию поставщики контента не поддерживают потоки. Если у вас есть несколько потоков, использующих поставщика контента, вы можете увидеть много разных исключений и другие несоответствия данных. Самый простой способ исправить это - использовать ключевое слово synchronized в каждом из общедоступных методов, предоставляемых поставщиком содержимого.
Таким образом, только один поток одновременно может получить доступ к этим методам.
2. Играйте хорошо, когда много пишите
Мне нужно новое приложение Serval Maps для импорта данных из двоичных файлов в базу данных, используемую внутри приложения. Чтобы сделать это и поиграть с остальной частью приложения, лучше всего:
Создайте новый поток для выполнения импорта, чтобы не пострадали другие потоки, в частности поток, отвечающий за обновление пользовательского интерфейса; и ненадолго приостанавливаться в конце каждого импорта, чтобы дать другим потокам больше шансов использовать синхронизированные методы.
3. Провайдеры контента иногда заставляют вас мыслить нестандартно.
Поставщики контента в Android работают так, чтобы обеспечить уровень абстракции между остальной частью вашего кода и базовой базой данных. В основном это связано с тем, насколько я могу судить, провайдеры контента могут получать доступ к данным из других мест, кроме баз данных.
Это означает, что вы не можете выполнять необработанные SQL-запросы в базовой базе данных, и вам необходимо указать различные компоненты SQL-запроса, используя переменные, передаваемые в различные методы, такие как метод запроса. Если у вас есть задача, которая не вписывается в способ обработки SQL поставщиком контента, у вас есть два варианта:
Подумайте о запросе горизонтально, возможно, вы сможете получить нужные данные с помощью альтернативных запросов и доступа к результатам с помощью курсора; и Используйте URI для обычного доступа к данным и специальный URI, соответствующий конкретному запросу для тех задач, для которых нет альтернатив.