2011-08-17 3 views
1

Je crée une application Android, qui obtient ses informations à partir de fichiers XML. Je remplis les informations dans une base de données, pour un accès plus facile pendant l'exécution du programme, grâce à la puissance des requêtes.Utilisation de plusieurs méthodes dans une transaction

Cependant, il est venu à mon attention, que l'utilisation des transactions améliore grandement la vitesse, donc naturellement, je veux utiliser cela.

Mon problème est le suivant tho; Dans l'idée de l'abstraction, après l'analyse de toutes les informations de un sujet, l'information est envoyée à l'entité correcte (classe), et à l'intérieur de cette entité il y a une méthode qui va l'ajouter dans la base de données. Après cela, il retourne à l'analyseur qui continue à lire le sujet suivant, qui dans son tour sera envoyé à droite (et probablement différent) de classe à nouveau.

Ceci est implémenté avec une instruction switch, chaque cas pointant vers un constructeur de classe différent. Si je veux utiliser la vitesse des transactions, je dois commencer une transaction avant l'analyse, passer par l'analyse et la construction de la requête (pour autant que je sache, toutes les requêtes construites dans la transaction, sont collectées et à la fin tous exécutés comme un tas) et finissent la transaction, une fois que le fichier entier est analysé.

Pour que cela soit un peu plus clair, ou plus rapide à lire; L'idée de code serait;

Class parser(){ 
    database.beginTransaction(); 
    try{ 
     // start parsing in a whole different class, which also points to SQL queries (in different classes again) in the entitys with a switch 
     }catch(Exception e){ 
    database.endTransaction(); 
     } 
     database.endTransaction(); 
} 

J'espère avoir formulé ma question assez clairement. Cordialement,

Répondre

1

Oui, vous avez l'idée générale. Cependant, vous devez veiller à marquer la transaction comme réussie lorsque vous avez terminé l'analyse, et également à vous assurer que la transaction est toujours fermée même en cas d'exception.

Exemple de the docs:

db.beginTransaction(); 
try { 
    // do all the parsing in here 
    ... 
    db.setTransactionSuccessful(); 
} finally { 
    db.endTransaction(); 
} 
+0

Salut Graham Borland, Merci pour la réponse rapide. Le coeur de ma question est, si ce n'est pas un problème de démarrer un, disons «transaction générale» quelque part, et d'avoir beaucoup de code entre la transaction. La plupart des exemples trouvés, il suffit de démarrer une transaction, et exécuter instantanément une requête ou à la boucle max à travers quelque chose, puis exécuter des requêtes. –

+0

Par exemple, en utilisant l'exagération. La question serait, quand par exemple, faire un programme qui crée et remplit seulement une base de données. I * could * lancer une transaction directement sur la méthode principale, exécuter tout le reste du programme pendant que cette transaction reste ouverte, et puis quand tout est fait, réussir et terminer la transaction, enfin exécuter toutes les requêtes construites dans le programme à une fois que. Je comprends que c'est bien sûr exagéré et non désiré. –

+0

Il n'y a aucun problème à ouvrir la transaction pendant la durée d'une opération d'analyse XML longue durée. Il offre de nombreux avantages, y compris la vitesse, comme vous l'avez remarqué. –

Questions connexes