Problème de lecture de base de données SQLite (Java)

Problème de lecture de base de données SQLite (Java) - Java - Programmation

Marsh Posté le 23-11-2009 à 09:12:43    

Bonjour à tous,
 
Pour un projet de cours, j'essaye de lire une table contenant des transactions. J'utilise le code suivant:

Code :
  1. /**
  2.      * Import pending transactions records from the database
  3.      * @return HashMap containing deposit and associated account
  4.      */
  5.     public HashMap<Deposit, Account> importPendingTransactions() {
  6.         HashMap<Deposit, Account> pendingTransactions = new HashMap<Deposit, Account>();
  7.         Statement stat = null;
  8.         try {
  9.             stat = dbConnection.createStatement();
  10.             ResultSet transactionRS = stat.executeQuery("SELECT * FROM " + PENDING_TRANSACTION_TABLE + ";" );
  11.             while (transactionRS.next()) {
  12.                 // Convert SQL Date to Java one.
  13.                 Date transactionDate = new Date(transactionRS.getDate(TRANSACTION_DATE).getTime());
  14.                 Deposit depositTransaction = new Deposit(transactionRS.getFloat(TRANSACTION_AMOUNT), transactionDate);
  15.                 ResultSet accountRs = stat.executeQuery("SELECT * FROM " + ACCOUNT_TABLE + " WHERE " + ACCOUNT_ID + "=" + transactionRS.getString(TRANSACTION_ACCOUNT) + ";" );
  16.                 Account userAccount = null;
  17.                 while (accountRs.next()) {
  18.                     userAccount = new Account(accountRs.getInt(ACCOUNT_ID), accountRs.getString(ACCOUNT_NUMBER), Account.ACCOUNT_TYPE.CREDITCARD_ACCOUNT, accountRs.getFloat(ACCOUNT_BALANCE));
  19.                 }
  20.                 accountRs.close();
  21.                 if (userAccount != null) {
  22.                     // Add transaction & account couple to the hashmap.
  23.                     pendingTransactions.put(depositTransaction, userAccount);
  24.                 }
  25.             }
  26.             // Close Accounts Result Set
  27.             transactionRS.close();
  28.         } catch (SQLException e) {
  29.             Logger.getAnonymousLogger().log(Level.SEVERE, "Failed to execute SQL request to import pending transactions: " + e.getLocalizedMessage());
  30.             return null;
  31.         } finally {
  32.             if (stat != null) {
  33.                 try {
  34.                     stat.close();
  35.                 } catch (SQLException ex) {
  36.                     // Ignore exceptions in finally
  37.                 }
  38.             }
  39.         }
  40.         Logger.getAnonymousLogger().log(Level.INFO, pendingTransactions.size() + " pending transactions imported." );
  41.         return pendingTransactions;
  42.     }


 
Mon problème c'est que la requête SQLite me retourne qu'une seule ligne, alors que quand je parcours manuellement la table à l'aide de sqlite3, j'ai des dizaines de transactions.
 
Si l'un d'entre vous peut m'aider là dessus. :jap:

Reply

Marsh Posté le 23-11-2009 à 09:12:43   

Reply

Marsh Posté le 23-11-2009 à 10:01:28    

Je ne suis pas expert en SQLite mais, ce ne serait pas parce que tu fais une 2e requête au sein de la première, à partir du même Statement de la même connection? Le minimum serait de créer un nouveau statement pour la 2e requête.
 
Mais personnellement je te conseille de faire une seule requête avec une jointure de tables ce qui sera BEAUCOUP plus performant. Dans ce genre:
 
SELECT t.date, t.amount, ua.id, ua.number, ua.balance FROM transactions t, user_accounts ua WHERE t.user_account_id = ua.id


Message édité par cbeyls le 23-11-2009 à 10:34:52
Reply

Marsh Posté le 23-11-2009 à 17:28:54    

Pourquoi je n'y ai pas pensé plus tôt! Le problème venait effectivement que j'utilisais le même statement pour les deux requêtes. Je devais être fatigué hier soir.
 
Merci aussi pour les conseils sur la jointure. C'est un projet scolaire donc je manipule peu de données, et les performances sont vraiment en second plan :jap:

Reply

Marsh Posté le 23-11-2009 à 22:05:55    

Les jointures c'est vraiment un minimum en SQL, surtout dans ce cas-ci où il est évident qu'il faut les utiliser. Sinon ton prof va penser que tu n'as rien compris à SQL. Et en plus, ça rend ton code plus simple.


Message édité par cbeyls le 23-11-2009 à 22:07:01
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed