2013-03-26 3 views
0

У меня возникла серьезная проблема. Я хочу сохранить HashMap (я назову его «map» или «hm») в файл на устройстве Android, в котором работает приложение. Я хочу сохранить его на внутреннем хранилище.Как сохранить HashMap в файл и загрузить его

Я знаю, что такие вопросы были заданы как 100 раньше, и я попробовал около 25 из них, но никто из них не работал.

У меня есть 3 класса, один основной класс, который расширяет «Активность» и два других класса, один из которых называется «util». Я хотел написать два метода, чтобы сохранить и загрузить HashMap, и оба метода должны быть в классе «util». В основном классе я написал несколько методов для загрузки HashMap, поместил что-то в него и сохранил его снова.

До сих пор не сложно было решить мою проблему, но я хочу использовать методы «сохранить» и «загрузить» в других классах, кроме основного класса.

Я не знаю, как получить объект Context в других классах как основной класс, поэтому я не знаю, как вызвать метод openFileOutput().

В целом: Я хочу сохранить и загрузить HashMap в/из файла, который я хочу создать на внутренней памяти. Метод, который я использую, должен быть расположен в классе «util» и должен быть доступен для всех других классов, предпочитаемых статическим способом. Я пробовал много разных возможностей, но всегда получаю «FileNotFoundException». Я надеюсь, что вы можете мне помочь.

Некоторые из методов, которые я использовал:

 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(); 
    } 

В этом методе я должен использовать контекст, и я не знаю, как получить его в других классах. Я также получить «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(); 
    } 

Этот метод не работает, либо, я не знаю, какой я получил исключение.

И наконец: Если вы хотите мне помочь, пожалуйста, опишите, как получить каждый объект, который вы используете (ну, кроме основных вещей, таких как строки и т. Д.), И вставьте все свое решение. Мне очень жаль, если бы этот вопрос задавали раньше, я не мог его найти.

Редактировать

Я пытался использовать "this.getApplicationContext(). GetFilesDir() метод, но все еще получаю 'FileNotFoundException' ... Не знаю, что делать.

+4

«_I на самом деле не знаю, какой я получил исключение ..._» Если вы хотите, чтобы помочь вам, это вид информации, нам нужно ... Просто запустите ваш код и скопировать/вставить стек. Это наименьшее, что вы можете сделать ... – jlordo

+0

Какие типы содержатся в вашей «карте»? 'Hashmap '? – nattyddubbs

+0

Да, строки и целые числа. Иногда это тип моего класса Enum. Является ли проблема помещать объекты разных типов только в один HashMap, если вы этого не сделаете (не знаете, как это сказать) поместите вещи в эти ''? – Enagon

ответ

0

Если вы всегда вызываете свои Util -методы из классов с доступом к Activity, просто добавьте Context в качестве параметра в вызове метода.

В противном случае вы можете создать глобальный объект Application, из которого вы можете получить контекст. Этот конкретный Контекст не поддерживает создание представлений и других зависимых от Activity параметров, но методы openFileOutput()/openFileInput() должны быть точными, поскольку каталог находится на уровне приложения.

Для этого вы можете создать подкласс Application со статической ссылкой на себя:

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

Тогда вы можете просто позвонить MyApplication.getInstance();, чтобы получить контекст.

Вам также необходимо добавить свой класс приложения в манифест (с атрибутом name под тегом приложения).

Связанные чтения: Singletons vs ApplicationContext in android

+0

Спасибо, это действительно помогло мне! :) – Enagon