深入了解android中的内部存储

时间:2015-04-21 08:28:53

标签: android internal-storage

我写了一个只有一个MainActivity的简单应用。
MainActivity只有ListView和简单ArrayAdapter,它会显示整数 当用户点击菜单中的add按钮时 - 另外一个值添加到listView所有整数都保存在文件中。
当用户按预期点击delete时,会从listview中删除一个值 但是 没有做任何文件 这是一个完整的代码:

public class MainActivity extends Activity {
    private ArrayList<Integer> list;
    private static final String fileName = "any_path";
    private int ADD_ID = 0;
    private int DELETE_ID = 1;
    ArrayAdapter<Integer> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        load();
        ListView view = new ListView(this);
        setContentView(view);
        adapter = new ArrayAdapter<Integer>(this,android.R.layout.simple_list_item_1, list);
        view.setAdapter(adapter);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.add(0, ADD_ID,1, "Add");
        menu.add(0, DELETE_ID,0, "Delete");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == ADD_ID) { // if add was clicked
            adapter.add(adapter.getCount());
            save(); // SAVING HAPPENS HERE
            return true;
        } else if (item.getItemId() == DELETE_ID) { 
            list.remove(list.size()-1);
            adapter.notifyDataSetChanged();
            return true; // NOTHING DONE TO FILE
        } else {
            return super.onOptionsItemSelected(item);
        }
    }
    @Override
    public void onStop() {
        super.onStop();
        save();
    }
    private void save() {
        JSONArray array = new JSONArray();
        for (int el:list) {
            array.put(el);
        }
        Writer writer = null;
        try {
            OutputStream out = this.openFileOutput(fileName, Context.MODE_PRIVATE);
            writer = new OutputStreamWriter(out);
            writer.write(array.toString());
        } catch (IOException e) {}
        try {
            writer.close();
        } catch (IOException e) {}
    }
    private void load() {
        list = new ArrayList<Integer>();
        StringBuilder data = new StringBuilder();
        BufferedReader reader = null;
        try {
            InputStream in = this.openFileInput(fileName);
            reader = new BufferedReader(new InputStreamReader(in));
            String line = null;
            while ((line = reader.readLine()) != null) {
                data.append(line);
            }
            JSONArray array = (JSONArray)new JSONTokener(data.toString()).nextValue();
            for (int i=0;i<array.length(); i++)
                list.add(array.getInt(i));
        } catch (Exception e) {}
    }
}

一切正常,但我不明白如何从文件中神奇地删除价值观 更确切地说:
    1)用户点击了add五次,所以&#39; 0 1 2 3 4&#39;将保存在文件中:
2)用户已点击delete两次,因此列表将为0 1 2没有任何文件发生
3)如果我重新启动某个应用,我会看到0 1 2,而不是0 1 2 3 4 那是为什么?

2 个答案:

答案 0 :(得分:1)

关闭应用程序时,也会在onStop()中调用save():

public void onStop() {
    super.onStop();
    save();
}

因此,当它包含0,1,2,3时,它将重新启动它。

答案 1 :(得分:0)

您似乎应该将数据更新(重新加载)到listview并在删除后再次设置,因为adapter.notifyDataSetChanged();通知适配器,但数据已经存在,如果从{中移除}它将起作用直接{1}} 所以你应该直接重新加载数据。 希望它有所帮助。

<强>更新:

我以为你想倒退..我不知道你是否关闭listviewInputStream。通常它会因此而发生。