1

我遇到了一个大问题。我想将 HashMap(我将其称为“map”或“hm”)保存到运行应用程序的 android 设备上的文件中。我确实想将其保存在内部存储中。

我知道这样的问题以前被问过 100 个,我尝试了大约 25 个,但没有一个有效。

我有 3 个类,一个扩展“Activity”的主类和另外两个类,一个称为“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

1 回答 1

0

如果您总是Util从可以访问 a 的类中调用 -methods 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();来获取一个上下文。

您还必须在清单中添加您的应用程序类(在应用程序标签下使用名称属性)。

相关阅读: Android 中的 Singletons 与 ApplicationContext

于 2013-03-26T20:01:09.340 回答