2011-09-06 5 views
2

Devrais-je utiliser un ReadWriteLock sur les fonctions du contentprovider?Android contentprovider lock

Dans la requête du fournisseur de contenu, je fais getReadableDatabase, puis vérifie si c'est ouvert et fais la requête. Mais parfois, il se bloque sur Exception DatabaseIsClosed. Cela peut être qu'un autre processus fait un insert qui fait un getWritebleDatabase qui ferme le premier. J'utilise une application et un service qui interrogent et insèrent constamment sur le fournisseur de contenu. Il semble donc que le contentprovider n'est pas threadsafe.

Cela peut-il aider à synchroniser la fonction?

Merci!

Répondre

1

Dans la requête du fournisseur de contenu, je fais getReadableDatabase, puis vérifie s'il est ouvert et fait la requête. Mais parfois, il se bloque sur Exception DatabaseIsClosed. Cela pourrait être qu'un autre processus fait une insertion qui fait un getWritebleDatabase qui ferme le premier.

Vous devriez garder votre base de données ouverte pendant la durée de vie du ContentProvider, AFAIK.

Il semble donc que le fournisseur de contenu ne soit pas sécurisé.

AFAIK, un ContentProvider n'est appelé que sur un thread.

ContentProvider est principalement une façade et ne fournit aucune sécurité intrinsèque.

+0

À l'intérieur du [AlarmProvider] (http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android-apps/2.2.1_r1/com/android/alarmclock /AlarmProvider.java#AlarmProvider) ils obtiennent également une nouvelle base de données lisible/inscriptible sur chaque insertion/requête/mise à jour. Comme je le fais. Mais ils ne ferment pas la base de données reçue, pourquoi? Cela devrait aussi être instable, mais je suppose que nous demandons et insérons plus souvent que le AlarmProvider. –

+0

@CommonsWare vous voudrez peut-être mettre à jour votre réponse ... 'ContentProvider' peut être appelé à partir de plusieurs threads à la fois, conformément à la [documentation] (http://developer.android.com/reference/android/content/ContentProvider. html). Pour être juste, je ne pense pas que c'était très clair en septembre dernier. :) –

+0

@AlexLockwood: Oui, l'un des premiers arguments pour expliquer pourquoi on voudrait utiliser 'ContentProvider' était la sécurité du thread qu'il fournissait ... ce qui n'est pas le cas. Merci d'avoir signalé la réponse erronée! – CommonsWare