2009-11-09 27 views
2

Je construis une application mobile avec J2ME, et j'ai constaté que les données que j'écris dans un RecordStore sont accessibles pendant que le programme est encore en cours mais il est perdu après avoir quitté et le redémarrer. Aucune exception n'est levée, les données sont simplement perdues.Les données de J2ME RecordStore ne persistent pas entre les sessions

MISE À JOUR: Merci à tous pour vos suggestions. J'utilise NetBeans sur Windows 7. Je ne suis pas sûr s'il utilise la version de WTK que j'ai déjà installée ou une autre qu'il a installée ailleurs. J'ai vérifié mon dossier WTK pour les fichiers sur lesquels Pavel a écrit, mais je ne les ai pas trouvés. Maintenant, je suis en train de tester les fonctionnalités nécessitant de la persistance sur mon téléphone et tout le reste dans l'émulateur, mais il serait bien sûr préférable de pouvoir tout tester dans l'émulateur.

private RecordStore recordStore = null; 

public MyMIDlet() { 
    readStuff(); // output: nothing found in recordStore :(
    saveStuff(); 
    readStuff(); // output: stuff 
} 

private void readStuff() { 
    try { 
     recordStore = RecordStore.openRecordStore(REC_STORE, true); 
     int n = recordStore.getNumRecords(); 
     String stuff; 

     if (n == 0) { 
      stuff = "nothing found in recordStore :("; 
     } 
     else { 
      stuff = new String(recordStore.getRecord(1)); 
     } 

     System.out.println(stuff); 
    } 
    catch (Exception e) { 
     System.out.println("Exception occured in readStuff: " + e.getMessage()); 
    } 
    finally { 
     if (recordStore != null) { 
      try { 
       recordStore.closeRecordStore(); 
      } 
      catch (Exception e) { 
       // ignore 
      } 
     } 
    } 
} 

private void saveStuff() { 
    try { 
     recordStore = RecordStore.openRecordStore(REC_STORE, true); 
     int n = recordStore.getNumRecords(); 
     byte[] stuff = "stuff".getBytes(); 
     recordStore.addRecord(stuff, 0, stuff.length); 
    } catch (Exception e) { 
     System.out.println("Exception occured in saveStuff: " + e.getMessage()); 
    } finally { 
     if (recordStore != null) { 
      try { 
       recordStore.closeRecordStore(); 
      } catch (Exception e) { 
       // ignore 
      } 
     } 
    } 
} 
+2

Est-ce en cours d'exécution sur un combiné physique ou un émulateur? La persistance des données entre les sessions d'émulation peut dépendre de la manière dont vous quittez et des paramètres que vous avez définis. Le redémarrage de l'émulateur peut effacer les données persistantes. –

+1

Il fonctionne dans un émulateur, mais maintenant je vais l'essayer sur un combiné aussi. Je vous remercie. – neo2862

+0

Il a effectivement travaillé sur mon téléphone. Merci beaucoup! :) – neo2862

Répondre

1

Je pourrais enfin le faire fonctionner sur un vrai combiné. Il semble que, comme Martin Clayton l'a suggéré, la réinitialisation de l'émulateur a effacé les données. Je suis toujours à la recherche d'un moyen d'activer la persistance dans l'émulateur.

+0

@Botond - vérifiez les réponses de drubin et de Pavel - si vous n'avez toujours pas de chance avec l'émulateur, modifiez peut-être votre question pour ajouter des détails sur votre système d'exploitation et votre développement - peut-être d'autres suggestions seront faites. –

1

Si vous utilisez Windows Vista, il peut y avoir et presque des problèmes d'autorisation. Je ne suis pas sûr comment résoudre ceci mais vous voudrez peut-être vérifier que l'utilisateur qui exécute l'émulateur a accès à écrire dans le magasin d'émulateur. .

En AppDB/téléphone $/* db

+0

J'utilise NetBeans, et il a installé le Java ME SDK dans mon dossier personnel, C: \ Users \ Botond \ javame-sdk, donc j'ai un accès en écriture au dossier, mais cela ne fonctionne toujours pas. Merci quand même. – neo2862

3

Si vous utilisez Sun WTK, il crée un fichier nommé "in.use" dans son dossier "AppDB":

 
C:\WTK25\appdb\DefaultColorPhone\in.use 

Si vous fermez votre émulateur de façon inhabituelle (tuer un processus, par exemple), il ne serait pas le supprimer, et la prochaine fois que vous exécutez l'émulateur, il créer un dossier temporaire pour stocker des données:

 
C:\WTK25\appdb\temp.DefaultColorPhone1 

lors du démarrage de cette façon, il devrait imprimer dans la console: "Running wi la racine de stockage temp.DefaultColorPhone1 ".

Je le corrige, y compris dans mon fichier ".bat" une ligne pour la suppression du fichier "in.use" chaque fois que l'émulateur fonctionne. Mais vous devriez faire attention en exécutant plusieurs émulateurs à la fois.

+0

Merci. J'ai d'abord installé Sun WTK, puis NetBeans. Je ne suis pas vraiment sûr si NetBeans utilise la version que j'ai installée ou quelque chose d'autre qu'il a lui-même installé. Il n'y a pas de fichier in.use dans mon dossier DefaultColorPhone et pas de temp.DefaultColorPhone1 dans appdb. – neo2862

2

J'ai rencontré le même problème moi-même, j'ai cependant découvert que NetBeans, ou quoi que ce soit, supprime les fichiers de programme déployés après l'exécution. Ces fichiers sont situés dans le dossier C: \ Documents and Settings \ MyUser \ javame-sdk \ 3.0 \ work \ 0 \ appdb, peuvent être différents sur Vista/Win7 et je suppose que le numéro dans le chemin fait référence à l'émulateur que vous êtes actuellement en utilisant. Quoi qu'il en soit, dans ce dossier, recherchez quelque chose qui s'appelle votre RecordStore. Par exemple. "00000002_PSC_onfig.db", qui est mon magasin de configuration de suite nommé PSConfig. En copiant ceci par ex. "Copie de 00000002_PSC_onfig.db" il ne sera pas effacé. Après avoir nettoyé NetBeans, il suffit de le copier à son nom d'origine. La prochaine fois que vous atteindrez Run dans NetBeans votre magasin de disques sera là. C'est douloureux, mais au moins cela vous donne la possibilité d'utiliser l'émulateur pour déboguer votre gestion RMS.

1

Pour résoudre le problème de stockage, vous devez cocher l'option "Taille de stockage" dans le gestionnaire de plate-forme Netbeans. Aller dans les propriétés du projet; aller dans la plate-forme; gérer les émulateurs; sélectionnez la boîte à outils sans fil sun java; aller dans Outils et Extensions; préférences ouvertes; stockage; option de taille de stockage ... définir une taille.

cela fonctionne pour moi

2

Cette question a été autour pendant un certain temps, mais je suis tombé sur elle tout en regardant une réponse au même problème avec l'émulateur, mais dans mon cas, il était lors de l'utilisation du Java ME 3 SDK . Il est possible que la solution que j'ai trouvée puisse aussi résoudre ce problème.

utilisant:

emulator -Xdescriptor:/path/to/app.jad 

sera selon le docs: "Installer un MIDlet, exécuter et désinstaller après la fin."

Persister une installation (et il y a des données) vous devez utiliser:

emulator -Xjam:install=<JAD-file-URL> 

L'URL du fichier JAD peut être soit une adresse Web ou « fichier: ///path/to/app.jad » si vous voulez installer à partir de votre système de fichiers local. Cette commande d'installation affiche un numéro de stockage d'applications que vous pouvez ensuite utiliser pour lancer l'émulateur et exécuter l'application précédemment installée en appelant:

emulator -Xjam:run=<application-storage-number> 

Voir la docs pour d'autres options de ligne de commande.

0

J'ai rencontré le même problème sous Ubuntu Linux et en travaillant avec WTK 2.5.2 et Netbeans 8.0.2. Plus tard, j'ai pensé qu'il était causé par la fermeture de mon ordinateur portable sans fermer l'émulateur. Cela arrive aussi si vous exécutez un deuxième émulateur sans fermer le premier.

Ma solution est basée sur la meilleure réponse ici, vient de fermer tous les émulateurs et supprimez le fichier situé à

~/j2mewtk/2.5.2/appdb/DefaultColorPhone