ifproject - implémentation d'un Web Service financier et du client J2ME correspondant
4.4.3. Un peu de code, tout de même !
a. Le portefeuille, un objet ListeCode

Durant la visite guidée, nous avons implicitement vu que nous manipulions des listes de titres, que ce soit le portefeuille ou la liste des titres disponibles sur le serveur. Des codes passaient d’une liste à l’autre par un jeu d’ajout et de retrait. Ces listes étaient par ailleurs visualisées, alphabétiquement classées, sur les écrans du téléphone.

Pour une application utilisant le J2SE, ces listes étendraient naturellement une des implémentations de l’interface Collection. Or dans le J2ME, pour des raisons d’économie de mémoire, on ne trouve pas de « Collections ». C’est la raison pour laquelle nous avons créé notre propre classe ListeCode, dont le champ principal est un tableau de String et qui possède des méthodes permettant d’ajouter et de retirer des éléments de ces tableaux (public void ajouteTitre(String code) et public void retireTitre(String code)). Elle possède en outre une méthode public void trieListe() qui ordonne alphabétiquement la liste, par un algorithme de trie à bulle.

b. La persistance du portefeuille

Dans le MIDP, la problématique de la persistance est géré par des « record stores », qui sont en fait de petites bases de données, contenants des enregistrements, les « records » qui sont simplement des tableaux d’octets, chacun de ces enregistrements ayant un identifiant entier.

A la fermeture de l’application la méthode sauvegardePortefeuille() est appelée.

 

	private void sauvegardePortefeuille() throws RecordStoreException{

		RecordStore rs = null;
             	RecordEnumeration re = null;
            

             	rs = RecordStore.openRecordStore(persistencePF, true);
             	re = rs.enumerateRecords(null, null, false);

             	// purge de la sauvegarde précédente
             	while(re.hasNextElement()){
                	int id = re.nextRecordId();
                    	rs.deleteRecord((id));
             	}
             
             
             	// sérialisation des données à sauvegarder
             	for(int i = 0; i < portefeuille.getTaille(); i++ ){
                    	String code = portefeuille.getListe()[i];
                    	byte[] codebrut = code.getBytes();
                    	rs.addRecord(codebrut, 0, codebrut.length);
             	}
            

		// libération des ressources
             	re.destroy();
             	rs.closeRecordStore();

       }

Symétriquement, à l’ouverture de l’application, c’est la méthode chargePortefeuille() qui récupère les données persistantes, en désérialisant les tableaux d’octets enregistrés dans le RecordStore :

	private ListeCode chargePortefeuille() throws RecordStoreException {
		
		String[] liste;
		RecordStore rs = null;
             	RecordEnumeration re = null;

             	// ouverture du “RecordStore” avec création s’il  n’existe pas
             	rs = RecordStore.openRecordStore(persistencePF, true);
             	re = rs.enumerateRecords(null, null, false);
             	liste = new String[re.numRecords()];
             	int i = 0;
             	
             	// désérialisation des enregistrements
             	while(re.hasNextElement()){
                    byte[] codebrut = re.nextRecord();
                    String code = new String(codebrut);
                    liste[i] = code;
                    i++;
             	}
             
             	ListeCode lc = new ListeCode();
             	lc.setListe(liste);
             	lc.trieListe();
             	return lc;

	}

On remarque l’analogie avec le JDBC, le RecordEnumeration jouant en quelque sorte le rôle du ResultSet.

  • <<
  •  
  • >>