문제

I want to store the ArrayList of custom objects called WordList using the Internal Storage.

Here's my code:

@SuppressWarnings("serial")
public class WordList extends MainActivity implements Serializable {

public String name;
public ArrayList<String> wordarray;
public ArrayList<String> definitionarray;

public WordList(String newName)
{
    this.name = newName;
    this.wordarray = new ArrayList<String>();
    this.definitionarray = new ArrayList<String>();
}

public String getName()
{
    return name;
}

private void writeObject(ObjectOutputStream out) throws IOException {
    out.writeUTF(name);
    out.writeObject(wordarray);
    out.writeObject(definitionarray);
}

private void readObject(ObjectInputStream in) throws IOException,
        ClassNotFoundException {
    name = in.readUTF();
    wordarray = (ArrayList<String>) in.readObject();
    definitionarray = (ArrayList<String>) in.readObject();
}  
}

And here's the main activity:

    public class MainActivity extends Activity {
private EditText text;
private ArrayList<WordList> lists = new ArrayList<WordList>();
private TextView textview;
FileOutputStream fos;
String filePath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    text = (EditText) findViewById(R.id.editText1);
    textview = (TextView) findViewById(R.id.test);
    filePath = getApplicationContext().getFilesDir().getPath().toString() + ".fileName.txt";
}


public void onClick(View view) throws FileNotFoundException {
    switch (view.getId()) {
    case R.id.addtoarray:
        String input = text.getText().toString();
        WordList list = new WordList(input);
        lists.add(list);
        break;
    case R.id.save:
        try {
            File f = new File(filePath);
            FileOutputStream fos = new FileOutputStream(f, true);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            Toast.makeText(getApplicationContext(), "Wrote " + String.valueOf(lists.size() + "objects to file!"), Toast.LENGTH_LONG).show();
            oos.writeInt(lists.size());
            for(int i=0; i<lists.size(); i++)
            {
                oos.writeObject(lists.get(i));
            }
            oos.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        break;
    case R.id.load:
        File saveFile = new File(filePath);
        if (saveFile.exists())
        {
            Toast.makeText(getApplicationContext(), "File found!",
                    Toast.LENGTH_SHORT).show(); 
        try {
            FileInputStream fis = new FileInputStream(saveFile);
            ObjectInputStream ois = new ObjectInputStream(fis);
            int num = ois.readInt();
            for(int i = 0; i<num; i++)
            {
                WordList o = (WordList) ois.readObject();
                lists.add(o);
            }
            fis.close();
            ois.close();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
      } catch (StreamCorruptedException e) {
          e.printStackTrace();
      } catch (IOException e) {
          e.printStackTrace();
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }
    } else {
        Toast.makeText(getApplicationContext(), "File not found!",
              Toast.LENGTH_SHORT).show();
    }
        textview.setText(lists.get(0).getName());
        break;
    }
}

Regarding Toasts, the objects are saved, but the app have problems with reading them. Could someone please tell me what am I doing wrong here?

도움이 되었습니까?

해결책

You can do it in two steps:
1. You need to be able to convert your WordList object into a String object/variable and vice versa. You can use the advice from the comment to your question how to do this.
2. Then, you will be able to use SharedPreferences to save String objects

In your code you will do something like the following:
1. When you need to save an object in memory, you convert it into a String:

String my_object = GetStringFromMyObject(object_to_save);

2. Then you save it in SharedPreferences:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("my_object_key", my_object);

3. Finally, you can restore the value whenever you want:

MyObject object_to_restore = GetMyObjectFromString(prefs.getString("my_object_key", "default_value));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top