Arrays speichern mit FileOutputStream

  • Antworten:2
Assasin Knight
  • Forum-Beiträge: 3

11.03.2016, 14:57:47 via Website

Hallo,

Ich fange grade an mit der Programmierung und möchte gerne ein Array dauerhaft speichern, sodass beim wieder öffnen der App die veränderten Werte im Array erhalten bleiben.
Nach langen suchen und probieren hab ich es geschafft, aber ich weiß nicht ob es optimale ist.
Für jeden Arraywert wird eine Datei erstellt und gespeichert geht das gut mit mehreren Datein oder verstehe ich was falsch.

Hier unten ist der Code.

Mfg
Assasin

Meine XML Datei

android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textE"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onS"
    android:text="Save"/>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/viewL"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="onL"
    android:text="Load"/>
    `

Die Java Datei:

package com.mycompany.myapp;

import android.app.;
import android.os.
;
import android.view.;
import android.widget.
;
import android.;
import java.io.
;
import android.content.;
import android.text.style.
;
import java.util.;
import android.view.inputmethod.
;

public class MainActivity extends Activity
{

String Speicherplatz[] = {"leer","leer","leer"};
String Speicherdatei[] = {"Speicher1","Speicher2","Speicher3"};
int arraynummer =0;


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

public void onS(View view) // die Variablen in Datei speichern.
{

    if(arraynummer > 2) 
        // Max. drei Variablen speichern. 
        //wenn mehr wird der Speicher zurückgesetzt und
        //die anderen mit den neuen überschrieben
    {arraynummer=0;
        Toast.makeText(this, "Speicher zurückgesetzt. Drei Plätze vorhanden", Toast.LENGTH_SHORT).show();}

    EditText eingabeS = (EditText) findViewById(R.id.textE);
    Speicherplatz[arraynummer] = eingabeS.getText().toString();


    if(Speicherplatz[arraynummer].equals(""))
    {Toast.makeText(this, "kein speicher inhalt", Toast.LENGTH_LONG).show();}
    else{
    try
    {
        FileOutputStream fos = openFileOutput(Speicherdatei[arraynummer], Context.MODE_PRIVATE);
        try
        {
            fos.write(Speicherplatz[arraynummer].getBytes());
            Toast.makeText(this, "gespeichert", Toast.LENGTH_LONG).show();
            fos.close();
            arraynummer += 1;
        }
        catch (IOException e)
        {}
    }
    catch (FileNotFoundException e)
    {Toast.makeText(this, "datei nicht da", Toast.LENGTH_LONG).show();}
}}

public void onL(View view) // die Variablen aus den Datein laden
{
    arraynummer = 0;
    TextView anzeigeL = (TextView) findViewById(R.id.viewL);
    try
    {
        for(int i =0; i <= 2; i++)
        {
        FileInputStream fis = openFileInput(Speicherdatei[arraynummer]);
        try
        {
            byte[] readData = new byte[fis.available()];
            while (fis.read(readData) != -1)
            {
                String geladendeDatei = new String(readData);
                Speicherplatz[arraynummer] = geladendeDatei;
            Toast.makeText(this, "geladen", Toast.LENGTH_LONG).show();
            arraynummer++;
            }
        }
        catch (IOException e)
        {} 
        }
    }
    catch (FileNotFoundException e)
    {} 
    // anzeige von den gespeicherten Varablen. Pro Varable wird eine neue Zeile erschaffe.
    anzeigeL.setText(Speicherplatz[0] + "\n" + Speicherplatz[1] + "\n" + Speicherplatz[2]);
}

    }

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.03.2016, 15:15:10 via Website

Hallo Assasin Knight,
Herzlich wilkommen hier im Forum :)



Also das Optimal ist es auf keinen Fall!
Da gibt es bessere und einfachere Wege.
Hier mal ein paar vorschläge:
1. Du gehst das Arrray in einer schleife durch und hängst deine Werte mit einem bestimmten Trennzeichen z.B. einer Raute (#) oder Semikolen; an einen langen String.
Diesen speicherst du in den SharedPreferences.
Beim laden list du den String aus den Preferences und Splittest ihn an deinem Trennzeichen wieder in ein Array
2. Du benutzt google gson und serialisiert dein Array, speichst den Json string irgendwo, und dann kannst du den Json string ganz einfach über die GSON lib wieder in dein Array Objekt umwandeln.

Ich würde zweiteres nehmen, da es deutlich komfortabler und sicherer ist.

LG Pascal //It's not a bug, it's a feature. :) ;)

Assasin Knight

Antworten
Assasin Knight
  • Forum-Beiträge: 3

12.03.2016, 11:50:49 via Website

Hallo Pascal,

Danke für die schnelle Antwort und den willkommens Gruß :D

Werde beide Sachen ausprobieren. Denk das ich
die zweite Variante nehme, da sie sicher und komfertabler ist.

Mfg

Assasin

Antworten