Cette question date de 6 ans et Mark a raison de dire que, dans presque tous les scénarios auxquels vous pouvez penser, JDBC sur Android est à peu près aussi sensé que d'essayer d'utiliser un grille-pain dans le bain. Cependant, nous faisons parfois des choses parce que nous le pouvons et non parce que nous le devrions nécessairement, et aujourd'hui j'avais une raison justifiable de vouloir le faire (pour une application spécifique très niche fonctionnant dans un environnement inhabituel), c'est ainsi que j'ai trouvé cette question.
Résolution de l'erreur NoClassDefFoundError
d'abord, la raison pour laquelle il n'est pas capturé par le catch
bloc est parce que c'est une Error
pas une Exception
. Les deux Error
et Exception
hérite de Throwable
, pour que vous puissiez saisir cela à la place :
catch (Throwable t)
{
// This will catch NoClassDefFoundError
}
Je crois que ce n'est pas MySqlDataSource
qu'il ne peut pas trouver, mais l'une des classes ou interfaces dont il dépend - dans mon cas, c'était javax.naming.Referenceable
. Android ne fournit pas le javax.naming
alors essayer d'utiliser les fonctionnalités de regroupement du pilote Connector/J JDBC pour MySQL ne vous mènera pas très loin (vous pouvez essayer de fournir les dépendances manquantes, mais cette route mène probablement à la folie).
Au lieu de cela, vous aurez probablement plus de chance avec une implémentation de pool de connexion tiers. Il existe différentes bibliothèques Java pour ce faire. Certains d'entre eux fonctionneront sur Android. Celui que j'ai vérifié fonctionne est HikariCP . Il y a des instructions pour le configurer ici et, spécifiquement pour MySQL, ici .