Enregistrement de données, partie 1 (Storage) CodenameOne propose 4 manières différentes pour sauvegarder des données. La plus simple, la plus portable et la plus conseillée pour la majorité des cas est le Storage. Le Storage peut être comparé au RMS du J2ME pour ceux qui connaissent. Il répond à la plupart des besoins de stockage. Vous pouvez y stocker des données de type primitifs ou des objets. Pensez à inclure le package com.codename1.io 1- Ecriture de données dans un Storage : L'exemple suivant est une fonction qui récupère un nom saisi dans une zone de texte d'une ligne (TextField), l'enregistre dans le téléphone avec la classe Storage et affiche une confirmation. Cette classe est un singleton. public void enregistrenom( String nom=nomf.gettext() ; boolean verification=storage.getinstance().writeobject("nom", nom); if(verification==true){ Dialog.show("Enregistrement OK", "Enregistrement effectué", "OK", else { Dialog.show("Enregistrement KO", "Echec d'enregistrement", "OK", La méthode writeobject permet d'effectuer l'écriture de données dans un Storage et prend deux choses en paramètres. Le premier paramètre est le nom de la zone d'enregistrement c'est à-dire le nom que vous voulez donner à l'emplacement (vous pouvez voir ça comme le nom d'un fichier) où sera enregistré votre information. Le second paramètre est la donnée que vous voulez enregistrer. Elle peut être un objet mais dans ce cas là, il y aurait un truc supplémentaire à faire que nous verrons plus bas. 2- Lecture de données depuis un Storage : L'exemple suivant est une fonction qui récupère du storage le nom que nous avions enregistré ci-dessus, qui l'insère dans une variable et qui l'affiche sur une boite de dialogue.
public void lecturenom() { String nom=(string)storage.getinstance().readobject("nom"); //ou bien: String nom=storage.getinstance().readobject("nom").tostring( ); if(nom!=null){ Dialog.show("Nom relu", "Le nom lu: "+nom, "OK", La méthode readobject permet d'effectuer la lecture de données depuis un storage. Elle prend une seule chose en paramètre et retourne un objet. Ce paramètre est le nom de la zone d'enregistrement. Étant donné que readobject retourne un Object, il va falloir que vous convertissez ce qui est retourné vers le type approprié avant de l'utiliser. Si c'était un String que vous aviez enregistré dans le storage alors convertissez ce qui est retourné par readobject en String avant toute utilisation. Idem pour les autres types de donnée. 3- Enregistrement d'un objet (d'une classe personnelle) dans un Storage : Prenons maintenant un cas où vous avez besoin d'enregistrer plusieurs informations en une fois dans un Storage comme par exemple un nom, un prénom et un age. Ce serait bizarre, chiant et pas pro d'avoir à créer un Storage pour chacune de ces informations. Pour cela, nous allons créer une classe, l'instancier et intégrer à l'intérieur nos données pour pouvoir l'enregistrer dans le Storage. CodenameOne fournit l'interface Externalizable qui est similaire à l'interface Externalizable de Java SE. Cette interface permet à un objet de se déclarer externalisable pour la sérialisation.(ce qui implique le fait qu'un objet peut alors être stocké dans un fichier, dans un storage ou être envoyé sur un réseau). A cause du manque de réflection et d'obfuscation, ces objets doivent être enregistrés avec la classe Util de CodenameOne. CodenameOne ne supportera probablement jamais l'api de sérialisation de Java SE.à cause de sa taille et des complexités liés à l'obfuscation. La majorité des objets manipulés par CodenameOne sont externalisables. Nous allons maintenant créer une classe nommée InfosPersonne qui va implémenter l'interface Externalizable. package com.mycompany.myapp; import com.codename1.io.externalizable; import com.codename1.io.util; import java.io.datainputstream;
import java.io.dataoutputstream; import java.io.ioexception; Tutoriel téléchargé sur www.codenameonefr.com public class InfosPersonne implements Externalizable{ private String nom; private String prenom; private int age; public String getnom() { return nom; public void setnom(string nom) { this.nom = nom; public String getprenom() { return prenom; public void setprenom(string prenom) { this.prenom = prenom; public int getage() { return age; public void setage(int age) { this.age = age; public int getversion() { return 1; public void externalize(dataoutputstream out) throws IOException { Util.writeUTF(nom, out); Util.writeUTF(prenom, out); out.writeint(age);
public void internalize(int version, DataInputStream in) throws IOException { nom=util.readutf(in); prenom=util.readutf(in); age=in.readint(); public String getobjectid() { return "InfosPersonne"; Nous allons maintenant passer à l'enregistrement de notre classe avec la classe Util pour le rendre externalisable. Cela se fait comme avec le code suivant: Util.register("InfosPersonne",InfosPersonne.class); Vous pouvez mettre ce code dans la fonction init (de préférence) ou dans start(). Maintenant il nous est possible d'enregistrer un objet de notre classe dans le Storage avec une nouvelle fonction que nous nommons enregistreinfos. public void enregistreinfos( InfosPersonne ip=new InfosPersonne() ; ip,setnom(nomf.gettext()) ; ip.setprenom(prenomf.gettext()) ; ip.setage(integer.parseint(agef.gettext())) ; boolean verification=storage.getinstance().writeobject("infos", ip); if(verification==true){ Dialog.show("Enregistrement OK", "Enregistrement effectué", "OK", else { Dialog.show("Enregistrement KO", "Echec d'enregistrement", "OK", Si vous avez plusieurs objets à enregistrer (ce qui implique dans notre cas plusieurs infos de personnes), alors vous pouvez insérer tous ces objets dans un Vector par exemple avant de l'enregistrer avec writeobject. Cela vous donne un Vector rempli de vos objets dont chacun représente les infos d'une personne. ça peut ressembler à ceci:
InfosPersonne personne1=new InfosPersonne(); InfosPersonne personne2=new InfosPersonne(); InfosPersonne personne3=new InfosPersonne();... //blablabla Vector personnes=new Vector(); personnes.addelement(personne1); personnes.addelement(personne2); personnes.addelement(personne3); Storage.getInstance().writeObject("Infos", personnes); //blablabla Pour la lecture des données, il vous suffit de récupérer le (ou les) objet(s) du storage avec readobject puis d'accéder à leur contenu avec les méthodes getxxx().