0

I'm studying how to write and read data from a file in android. My problem is that when I close the app and re-open it, the data are missing, while if insert data and load them without closing tha app, they are loaded.Could someone help me understand what the problem is? Thanks. This is my code:

    public class MainActivity extends AppCompatActivity {

    /**
     * Dichiaro le mie variabili view
     * @param savedInstanceState
     */
    EditText name,surname;

    TextView result;
    ArrayList<Person> persons;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //set data
        name = findViewById(R.id.id_name);
        surname = findViewById(R.id.id_surname);
        result = findViewById(R.id.result);
        persons = new ArrayList<Person>();

        //invoco il metodo per caricare i dati dal file
        loadData();




    }

    /**Metodo che g aggiunge i dati sull'arraylist persons
     * @param v
     */
    public void addData(View v)
    {
        String myname = name.getText().toString();
        String mysurname = surname.getText().toString();

        //creiamo un oggetto persona per salvare i due dati
        Person person = new Person(myname,mysurname);

        //aggiungo lìoggetto all'arrayList
        persons.add(person);

        setTextToTextview();

    }

    /**
     * Metodo che si occupa di collegare il testo alla textview che visualizzerà il risultato
     */
    private void setTextToTextview() {
        String text = "";

        for(int i = 0; i < persons.size(); i++)
        {
            text = text + persons.get(i).getName() + "" + persons.get(i).getSurname() + "\n";
        }

        result.setText(text);
    }

    /**
     * Metodo che si occupa del salvataggio dei dati su un file
     */
    public void saveData(View v)
    {
          try {
              //uso le funzioni che gestiscon i file per scrivere i dati su file-
              //FileOutputStream crea il file: il primo parametro che gli passiamo è il nome del file, il secondo la modalitò di accesso
              FileOutputStream file= openFileOutput("Data.txt", MODE_PRIVATE);

              OutputStreamWriter outputfile = new OutputStreamWriter(file);

              //percorriamo tutti gli elemti dell'arraylist per scriverli sul file
              for(int i=0; i<persons.size(); i++)
              {
                outputfile.write(persons.get(i).getName() + "," + persons.get(i).getSurname() +"\n");
              }

              //mi assicuro che i dati vengano correttamente scritti su file
              file.flush();
              //chiudo il file
              file.close();

              Toast.makeText(MainActivity.this, "Successfully saved", Toast.LENGTH_SHORT).show();


          }
          catch (IOException e)
          {
              Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
          }
    }


    /**
     * Metodo che gestisce il caricamento dei dati da file di testo
     */
    /*
    public void loadData()
    {
        //pulisco i dati dell'arraylist.Quando richiamo quest funzione inizialmente nel metodo
        //oncreate è vuota, quindi non ce ne sarebbe bisogno, ma se la richiamassi all'interno di altre classi
        //potrebbe avere dei dati, in quel caso è meglio usare clear()
        persons.clear();

        //carico il file
        File file = getApplicationContext().getFileStreamPath("Data.text");

        //var per il salvatggio della singola linea del file
        String lineFromFile;

        if(file.exists()) {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(openFileInput("Data.txt")));
                //scorriamo il file linea per linea per salvare il contenuto
                while((lineFromFile = reader.readLine()) != null)
                {
                    //salviamo ogni componente della riga in token. Passiamo al costruttore la variabile contente la linea
                    //e il delimitatore dei due elementi del file che nel nostro caso è la virgola(lo abbiamo scelto noi
                    //quando abbiamo creato il file)
                    StringTokenizer tokens = new StringTokenizer(lineFromFile, ",");
                    Person person = new Person(tokens.nextToken(), tokens.nextToken());
                    persons.add(person);
                }

                reader.close();
                setTextToTextview();
            }
            catch (IOException e) {
                Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }

     */

    public void loadData()
    {
        try {
            InputStream inputStream = openFileInput("Data.txt");
            if(inputStream != null)
            {
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String lineFromFile;
                while((lineFromFile = bufferedReader.readLine()) != null)
                {
                    //salviamo ogni componente della riga in token. Passiamo al costruttore la variabile contente la linea
                    //e il delimitatore dei due elementi del file che nel nostro caso è la virgola(lo abbiamo scelto noi
                    //quando abbiamo creato il file)
                    StringTokenizer tokens = new StringTokenizer(lineFromFile, ",");
                    Person person = new Person(tokens.nextToken(), tokens.nextToken());
                    persons.add(person);
                }

                inputStream.close();
                bufferedReader.close();
                setTextToTextview();
            }
        }
        catch (IOException e)
        {

        }


    }

}

The xml file is:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/id_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:ems="10"
        android:hint="enter name"
        android:inputType="textPersonName"
        android:minHeight="48dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/id_surname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:ems="10"
        android:hint="enter surname"
        android:inputType="textPersonName"
        android:minHeight="48dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/id_name" />

    <Button
        android:id="@+id/buttonAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:onClick="addData"
        android:text="Add data"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/id_surname" />

    <Button
        android:id="@+id/buttonSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        android:onClick="saveData"
        android:text="Save"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonAdd" />

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="20dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="20dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonSave"
        tools:text="result" />
</androidx.constraintlayout.widget.ConstraintLayout>
Heda Lexa
  • 1
  • 1

0 Answers0