1. Les fournisseurs de contenu ne sont pas sûrs pour les threads
Par défaut, les fournisseurs de contenu ne sont pas thread-safe. Si vous avez plusieurs threads utilisant un fournisseur de contenu, vous pouvez voir de nombreuses exceptions différentes levées et d'autres incohérences de données. Le moyen le plus simple de résoudre ce problème consiste à utiliser le mot clé synchronized sur chacune des méthodes publiques exposées par le fournisseur de contenu.
De cette manière, un seul thread à la fois peut accéder à ces méthodes.
2. Jouez bien lorsque vous écrivez beaucoup
J'ai le besoin dans la nouvelle application Serval Maps d'importer des données de fichiers binaires dans la base de données utilisée en interne par l'application. Pour ce faire et jouer bien avec le reste de l'application, il est préférable de:
Créez un nouveau thread pour entreprendre l'importation afin que les autres threads ne soient pas affectés, en particulier le thread en charge de la mise à jour de l'interface utilisateur; et Pause brièvement à la fin de chaque importation pour donner plus de chance aux autres threads qui ont besoin d'utiliser les méthodes synchronisées.
3. Les fournisseurs de contenu vous obligent parfois à penser latéralement
La façon dont les fournisseurs de contenu dans Android fonctionnent est de fournir une couche d'abstraction entre le reste de votre code et la base de données sous-jacente. Cela est principalement dû au fait, pour autant que je sache, que les fournisseurs de contenu peuvent accéder aux données à partir d'endroits autres que les bases de données.
Cela signifie que vous ne pouvez pas exécuter de requêtes SQL brutes sur la base de données sous-jacente et que vous devez spécifier les différents composants d'une requête SQL à l'aide de variables transmises aux différentes méthodes telles que la méthode de requête. Si vous avez une tâche qui ne correspond pas à la manière dont SQL est géré par un fournisseur de contenu, vous avez deux options:
Pensez latéralement à la requête, vous pouvez peut-être obtenir les données dont vous avez besoin par des requêtes alternatives et en accédant aux résultats à partir du curseur; et Utilisez un URI pour accéder aux données normalement et un URI spécial qui correspond à une requête spécifique pour les tâches qui n'ont pas d'alternatives.