0

我一直在尝试一百种不同的方法来解决我的问题,但由于某种原因,它们简单地不起作用。我正在尝试一种快速而肮脏的方式,以使我的应用程序持久化。它基本上得到了很多在销毁时需要保存的对象,所以我想我会让它把对象放入一个 ArrayList 中,然后使用 ObjectOutputStream 将 ArrayList 写入文件。

public void onStop() {
    super.onStop();
    Log.d("Event", "Stopped");
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;
    try {
        fos = openFileOutput("Flights", MODE_WORLD_WRITEABLE);
        oos = new ObjectOutputStream(fos);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    ArrayList<Flight> alFlightList = new ArrayList<Flight>();
    Iterator it = flightMap.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        alFlightList.add((Flight) pairs.getValue());
    }
    try {
        oos.writeObject(alFlightList);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        Log.d("Info", "File created!");
    }      
}

我得到了一个类似的算法来再次读取它,但它抱怨没有任何文件可供读取。我知道使用文件进行持久化并不是最佳实践,但正如前面提到的,这应该是一个快速而肮脏的解决方案。(但我现在用在它上面的时间,还不如花在制作数据库上。._.)谢谢!

4

3 回答 3

1

从关于保存持久状态的文档中,

活动通常会处理两种持久状态:类似文档的共享数据(通常使用内容提供程序存储在 SQLite 数据库中)和内部状态,例如用户偏好。

对于内容提供者数据,我们建议活动使用“就地编辑”用户模型。也就是说,用户所做的任何编辑都会立即有效地进行,而无需额外的确认步骤。支持这个模型通常很简单,遵循两个规则:

创建新文档时,会立即为其创建后备数据库条目或文件。例如,如果用户选择写一封新电子邮件,一旦他们开始输入数据,就会为该电子邮件创建一个新条目,这样如果他们在那之后进入任何其他活动,这封电子邮件将现在出现在草稿列表中。当一个活动的 onPause() 方法被调用时,它应该提交给支持的内容提供者或记录用户所做的任何更改。这可确保将要运行的任何其他活动都可以看到这些更改。您可能希望在活动生命周期的关键时刻更加积极地提交数据:例如在开始新活动之前、完成自己的活动之前、用户在输入字段之间切换时等。

因此,如果您想“正确”地执行此操作,我会将数据保存在onPause...中,并且我可能会使用某种 SQLite 数据库保存状态。您还应该使用 . 在单独的线程上执行文件 I/O AsyncTask,因为这种事情可能会阻塞 UI 线程并使您的应用程序崩溃。

如果您想要一种快速而肮脏的方式来做到这一点(即,如果您没有在 Android 市场上发布此应用程序),那么我敢打赌,问题在于您正在尝试执行文件 I/O onDestroy,这不是保证被调用。这是执行文件读/写的另一个原因onPause

我建议的最后一件事是阅读有关内部/外部存储的文档。可能是您没有写入正确的目录,因为您没有这样做的文件权限。您应该像这样执行文件 I/O:

String FILENAME = "FLIGHTS";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(...);
fos.close();
于 2012-06-24T15:53:44.193 回答
0

替换 /sdcard/Flights 中的 Flight,否则它会在空空间中创建一个文件。:) 我不确定它是否会起作用。

于 2012-06-24T15:49:48.953 回答
0

为什么不用数据库?并在创建或重新启动应用程序时从数据库中回调所有设置?

您还可以使用 onpause() 或 onstop() 方法将所有数据存储到数据库中。

于 2012-06-24T17:26:24.330 回答