2013-03-26 8 views
0

J'ai un problème majeur. Je veux enregistrer un HashMap (je l'appellerai 'map' ou 'hm') dans un fichier sur le périphérique Android sur lequel l'application s'exécute. Je veux l'enregistrer sur le stockage interne.Comment enregistrer HashMap dans un fichier et le charger

Je sais que des questions comme celle-ci ont été posées comme 100 avant et j'ai essayé environ 25 d'entre eux, mais aucun d'eux n'a fonctionné.

J'ai reçu 3 classes, une classe principale qui étend 'Activity' et deux autres classes, une appelée 'util'. Je voulais écrire deux méthodes, enregistrer et charger le HashMap, et les deux méthodes devraient être dans la classe 'util'. Dans la classe principale, j'ai écrit plusieurs méthodes pour charger le HashMap, y mettre quelque chose et le sauvegarder à nouveau. Jusqu'à ici, il ne devrait pas être difficile de résoudre mon problème, mais je veux utiliser les méthodes 'save' et 'load' dans d'autres classes à l'exception de la classe principale.

Je ne sais pas comment obtenir l'objet Context dans d'autres classes en tant que classe principale, donc je ne sais pas comment appeler la méthode openFileOutput().

En résumé: Je veux enregistrer et charger un HashMap vers/à partir d'un fichier que je veux créer sur le stockage interne. La méthode que j'utilise devrait être située dans la classe 'util' et devrait être accessible pour toutes les autres classes, de préférence de manière statique. J'ai essayé beaucoup de possibilités différentes mais j'ai toujours une 'FileNotFoundException'. J'espère que vous pouvez m'aider.

Certaines des méthodes que j'ai utilisé:

 try { 
     FileOutputStream fos = c.openFileOutput(s, Context.MODE_PRIVATE); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(hm); 
     oos.flush(); 
     oos.close(); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

A cette méthode, je dois utiliser le contexte, et je ne sais pas comment l'obtenir dans d'autres classes. Je reçois aussi un « FileNotFoundException » ...

String file = The path where my file should be located (I don't know how it should be given, but "data/data/[packagename]/[file]" does not work) 

     try { 
     FileOutputStream fos = new FileOutputStream(file); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(hm); 
     oos.flush(); 
     oos.close(); 
     fos.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Cette méthode ne fonctionne pas non plus, je ne sais pas vraiment quelle exception je suis arrivé.

Enfin: Si vous voulez m'aider, veuillez décrire comment obtenir chaque objet que vous utilisez (enfin, sauf les éléments de base comme les chaînes de caractères, etc ...) et collez l'ensemble de votre solution. Je suis vraiment désolé si exactement cette question a été posée avant, je ne pouvais pas le trouver.

Modifier

J'ai essayé d'utiliser la méthode 'this.getApplicationContext(). GetFilesDir()' mais toujours obtenir un 'FileNotFoundException' ... Je ne sais pas quoi faire.

+4

« _Je ne savent pas vraiment quelle exception je suis arrivé ..._ » Si vous voulez que nous vous aider, c'est le genre d'information dont nous avons besoin ... Il suffit de lancer votre code et copier/coller la pile. Il est le moins vous pouvez faire ... – jlordo

+0

Quels types sont contenus dans votre 'Map'? 'Hashmap '? – nattyddubbs

+0

Oui, chaînes et entiers. Parfois, un type de ma classe Enum. Est-ce un problème de mettre différents types d'objets en un HashMap si vous ne (ne sais pas comment le dire) mettre les choses dans les ''? – Enagon

Répondre

0

Si vous appelez toujours vos méthodes Util depuis des classes ayant accès à un Activity, ajoutez simplement le Context en tant que paramètre dans votre appel de méthode.

Sinon, vous pouvez créer un objet global Application à partir duquel vous pouvez obtenir un contexte. Ce contexte particulier ne prend pas en charge la création de vues et d'autres options dépendantes de l'activité, mais les méthodes openFileOutput()/openFileInput() devraient fonctionner car le répertoire est au niveau de l'application.

Pour ce faire, vous devez créer une sous-classe d'application avec une référence statique à lui-même:

//In the Application subclass: 
static MyApplication instance; 
onCreate(){ 
    super.onCreate(); 
    instance = this; 
} 
public static final MyApplication getInstance(){ 
    return instance; 
} 

Ensuite, vous pouvez simplement appeler MyApplication.getInstance(); pour obtenir un contexte.

Vous devrez également ajouter votre classe d'application dans le manifeste (avec le nom attribut sous la balise d'application).

lecture connexe: Singletons vs ApplicationContext in android

+0

Merci, cela m'a vraiment aidé! :) – Enagon

Questions connexes