SQLite DB accessible à partir de plusieurs threads
Considérez ce qui suit: j'ai Service
, qui écrit en DB dans AsyncTask
. Et mon Activité lit les données à partir DB(tenir compte des thread d'INTERFACE utilisateur pour des raisons de simplicité). - Je accéder à la DB à l'aide de SQLiteOpenHelper
. J'ai créer une seule instance dans Application onCreate() puis obtenir en service et de l'activité. Est-il possible que je voudrais obtenir mon DB "mort verrouillé"? Auparavant, j'ai utilisé ContentProvider pour de telles opérations. Cependant, il est basé sur l'utilisation de la seule SQLiteOpenHelper
exemple, j'ai décidé de simplifier mon projet en excluant ContentProvider
.
Envisager code:
public class App extends Application {
private OpenHelper openHelper;
@Override
public void onCreate(){
super.onCreate();
openHelper=new OpenHelper();
}
public OpenHelper getHelper(){
return openHelper;
}
}
De L'Activité:
OpenHelper helper=(App)getApplication().getHelper();
SQLiteDatabase db=helper.getReadableDatabase();
// Do reading
Et à l'intérieur Prolongée, dans le thread séparé:
OpenHelper helper=(App)getApplication().getHelper();
SQLiteDatabase db=helper.getWritableDatabase();
//Do writing
Serait-il sûr?
UPD Cette peut être la solution, mais vous ne savez pas comment l'utiliser.
Vous devez vous connecter pour publier un commentaire.
En retard, en retard de réponse. Vous êtes tout à fait bien. C'est la bonne façon de le faire, en fait. Voir mon blog: http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection/. Creuser par le biais de mon profil ici. Beaucoup d'exemples de cela. ContentProvdier est juste beaucoup de frais généraux et n'est pas nécessaire, sauf si vous êtes le partage de données en dehors de votre application. Les Transactions sont bonnes pour accélérer les choses et (évidemment) améliorer la cohérence, mais pas nécessaire.
Il suffit d'utiliser une SqliteOpenHelper dans votre application et que vous êtes en sécurité.
Mon pari: il n'est pas sûr.
Être en position plus sûre vous devez utiliser des transactions SQL. Commencer avec
beginTransaction()
oubeginTransactionNonExclusive()
et terminer avecendTransaction()
. Comme montré iciC'est ma solution
J'ai créé une classe et d'une salle de statique de l'objet à synchroniser tous les db accès
}
J'ai essayé en utilisant ASYNC tâche et il fonctionne très bien .
J'espère, c'est la bonne façon de résoudre le problème.
D'autres suggestions ???
Bonne question. Ma première pensée est qu'il ne serait pas sûr. Toutefois, selon le SQLite docs, SQLite peut être utilisé dans les 3 modes. Le mode par défaut est "sérialisé" mode:
Donc j'assume ce qu'elle est compilée en mode sérialisé sur Android.
Viens de voir cela alors que je cherchais quelque chose d'autre.
Ce problème semble que ça peut être efficacement résolu à l'aide d'un ContentProvider. De cette façon, à la fois l'Activité ainsi que le Service peut utiliser le fournisseur de contenu et qui prendra soin de la Db problèmes de contention.