如何永久保存数据,以便稍后在 Android 中访问?

Posted

技术标签:

【中文标题】如何永久保存数据,以便稍后在 Android 中访问?【英文标题】:How do I save data permanently so I can access it later in Android? 【发布时间】:2012-09-30 22:33:35 【问题描述】:

每当我按下后退按钮时,我的应用程序都不会调用 onSaveInstanceState(),并且我无法保存数据。我正在尝试制作一个调度程序应用程序,即使按下后退按钮,我也需要保存已经设置的时间表。我想通过将源文件中的新数据添加到 stringArray 来动态编辑 ListView。我遇到的问题是文件 schedules.txt 没有保存。每当程序打开一个新活动时,该文件现在都是空白的。

这是我目前的代码:

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_schedules);
    ListView listview = (ListView) findViewById(R.id.scheduleListView);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, schedulesList); 
    listview.setAdapter(adapter);
    Log.v("myapp", "currentlist of files associated with this program are: " + fileList());

    try 

        FileOutputStream fout = openFileOutput("schedules.txt", MODE_PRIVATE);
        Log.v("myapp", "FileOutputStream ran");

     catch (FileNotFoundException e1) 
        // TODO Auto-generated catch block
        e1.printStackTrace();
    

try 
       Log.v("myapp", "first get old schedules call");
       getOldSchedules();
 catch (IOException e) 
    // TODO Auto-generated catch block
    e.printStackTrace();



public void editFile(String format) throws IOException 

    Log.v("myapp", "editFile ran");
    FileOutputStream fout = openFileOutput("schedules.txt", MODE_PRIVATE);
    OutputStreamWriter writer = new OutputStreamWriter(fout);

    writer.write("hello alex");
    writer.flush();
    writer.close();
    Log.v("myapp", "secondary getoldschedules call");
    getOldSchedules();


public void getOldSchedules() throws IOException

    FileInputStream fis = openFileInput("schedules.txt");
    InputStreamReader reader = new InputStreamReader(fis);

    char[] inputbuffer = new char[32];
    reader.read(inputbuffer);
    String data = new String(inputbuffer);
    Log.v("myapp", "data in file reads: " + data);

    reader.close();



【问题讨论】:

您可能对使用 SQLite 感兴趣。不错的教程:SQLite Database and ContentProvider 【参考方案1】:

据我所知,您的保存代码没有任何问题。 onSaveInstanceState 没有被调用的原因是因为在这种情况下它是错误的工具。仅当 Activity 被系统杀死时才调用该方法意图将其带回。来自 Android 文档:

当调用 onPause() 和 onStop() 而不是这个方法的一个例子是当用户从活动 B 导航回活动 A 时:不需要在 B 上调用 onSaveInstanceState(Bundle) 因为那个特定的实例会永远不会被恢复,所以系统会避免调用它。

使用后退按钮离开 Activity 是上述场景的一个示例 - Activity 正在被销毁,因此不需要保存状态以供以后恢复。 onSaveInstanceState 更多地是为小的 UI 事物而设计的,例如哪些复选框中有检查,或者在字段中输入的文本 - 不是持久数据存储。您应该考虑将保存调用发送到 onPause(如果它很快的话)、onStoponDestroy

【讨论】:

【参考方案2】:

这里是 android 开发者网站上的数据存储选项指南,它应该会告诉你你需要知道的一切:http://developer.android.com/guide/topics/data/data-storage.html

【讨论】:

以上是关于如何永久保存数据,以便稍后在 Android 中访问?的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap如何在android上保存永久数据

如何在处理中保存设置数据,然后稍后加载以供使用

将已删除的行保存在数据表中,以便稍后在数据库中删除

如何将 pid 的值保存在数据结构中并稍后使用 fork() 访问它?

Android数据存储SharedPreferences

Windows 命令:如何使用 chdir 推送当前目录以便稍后弹出?