Android Daten speichern und anzeigen

RezaScript

Bekanntes Mitglied
Hallo,

in meiner MainActivity habe ich zwei Buttons. Wenn ich darauf klicke, erscheint ein Dialog (DialogFragment). Je nach dem auf welchen Button ich drücke, beinhaltet der Dialog ein anderes Fragment.

Ich möchte folgendes:
Im Dialog 1 kann ich etwas eintippen und das, was ich eingetippt habe, soll im Dialog 2 angezeigt werden, und zwar nicht temporär, sondern auf Dauer ... also auch wenn ich die App beende und sie wieder neu starte.

Was ist hier der einfachste Weg wie ich vorangehen könnte?
 
Da wäre der Anlaufpunkt wohl https://developer.android.com/training/data-storage

Dort wird erläutert, was für Möglichkeiten du direkt hast. Ist halt immer die Frage, wer ggf. noch auf die Daten zugreifen können soll...

So das nur für Deine App ist, dann wäre https://developer.android.com/training/data-storage/app-specific das, was Du Dir anschauen solltest.

Und dann geht es z.B. einfach so:
Java:
String filename = "myfile";
String fileContents = "Hello world!";
try (FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE)) {
    fos.write(fileContents.toByteArray());
}

Und das Lesen:
Java:
FileInputStream fis = context.openFileInput(filename);
InputStreamReader inputStreamReader =
        new InputStreamReader(fis, StandardCharsets.UTF_8);
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(inputStreamReader)) {
    String line = reader.readLine();
    while (line != null) {
        stringBuilder.append(line).append('\n');
        line = reader.readLine();
    }
} catch (IOException e) {
    // Error occurred when opening raw file for reading.
} finally {
    String contents = stringBuilder.toString();
}

(Beispiele einfach von der genannten Webseite kopiert!)
 
Wenn du etwas speichern willst also Zb Einstellungen . Solltest du dir mal SharedPreferences anschauen .
Ich denke das ist das was du suchst.


Klar kann man es auch selbert in einer normalen Datei speichen.
 
@Jw456 ja, SharedPrefences scheint schon das zu sein wonach ich suche. Das Problem dabei ist aber, dass ich pro Key nur einen Wert speichern kann. Ich habe 1 Textfeld und egal was der User hier drin eintippt, möchte ich das alles gespeichert wird, damit ich diese Begriffe dann in einem View auflisten kann.

Also nach meinem Verständnis müsste ich so vorgehen:
  • Leere ArrayList erstellen
  • Bereits gespeicherte Daten (als String) abrufen und in ArrayList speichern
  • Der Wert vom Textfeld in der ArrayList hinzufügen
  • Die ArrayList in String umwandeln und in Shared Prefences speichern
So, das wäre der Speicherprozess. Wenn ich den Wert aber lese, habe ich aber immer noch einen String. Ich brauche aber eine Liste. Ich denke in meinem Fall ist Gson das Schlüsselwort, ich verstehe die Logik dahinter aber nicht wie ich vorgehen sollte. Wäre froh, wenn mich jemand hier etwas aufklären würde.
 
@Jw456 danke, das ist ein gutes Beispiel und sieht so ziemlich ähnlich aus wie das, was ich bereits habe, nämlich:

Java:
SharedPreferences sharedPreferences = getActivity().getSharedPreferences("prefs", Context.MODE_PRIVATE);
@SuppressLint("CommitPrefEdits") SharedPreferences.Editor editor = sharedPreferences.edit();
Gson gson = new Gson();
String json = gson.toJson(arrayItems);
editor.putString("k-text", json);
editor.apply();
String oldData = sharedPreferences.getString("k-text", null);

Im Tutorial steht aber nicht wie das Array entsteht und in meinem Fall ist das Array auch leer, deshalb wundert es mich auch nicht, warum nichts gespeichert wird.

Ich muss also vorerst Daten, welche bereits gespeichert sind abrufen. oldData sollte also einen String liefern und der Wert des Textfelds ist auch nur ein String. Ich habe also ins gesamt 2 Strings und kein Array. Ich könnte beide Strings zwar schon in einer ArrayList abspeichern aber das Problem ist das erste String (also oldData), denn darin sind ja mehrere Einträge gespeichert. Also wenn, dann müsste ich aus dem ersten String ein Array machen und den zweiten String dann zu diesem Array hinzufügen. Oder verstehe ich da etwas falsch?
 
Der Code aus dem Link benutzt auch eine dynamische Liste (ArrayList) vom Type Objekt die in die Shprefs gespeichert werden. Entweder du baust einen App Code um auf eine Liste und nicht Array.
Oder du baust das speichern um auf Array um.

In den Link sind es auch zwei Methoden eine zum lesen und eine zum speichern.

Natürlich solltest du erst mal etwas speichern das heißt auch erst mal etwas in dein Array oder Liste eintragen bevor du die speichern Methode aufrufst.
auch solltest du erst lesen wenn du vorher etwas gespeichert hast.
Das solltest du in deinem Code abfangen.


Hier ein einfaches Beispiel was den Code aus dem Link benutz eine ArrayListe erstellt mit Daten füllt und speichert und wider liest.

Java:
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    public ArrayList<String> myListe;

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

        Button bt = findViewById(R.id.button);
        TextView tv = findViewById(R.id.text);

        myListe = readFromSharedPreferences(this);

        if (myListe == null) {
            myListe = new ArrayList<>();
        }
        tv.setText(myListe.toString());

        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                myListe.add("Hund");
                myListe.add("Katze");
                myListe.add("Maus");
                writeToSharedPreferences(MainActivity.this, myListe);

                tv.setText(myListe.toString());
            }
        });
    }


    public boolean writeToSharedPreferences(Context context, ArrayList<String> arrayList) {
        String file = "arraylist";
        SharedPreferences mPrefs = context.getSharedPreferences(file, Context.MODE_PRIVATE);
        SharedPreferences.Editor prefsEditor = mPrefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(arrayList);
        prefsEditor.putString("arraylist", json);
        prefsEditor.commit();
        return true;
    }


    public ArrayList<String> readFromSharedPreferences(Context context) {
        String file = "arraylist";
        SharedPreferences mPrefs = context.getSharedPreferences(file, Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = mPrefs.getString("arraylist", "");
        Type type = new TypeToken<List<String>>() {
        }.getType();
        ArrayList<String> arrayList = gson.fromJson(json, type);
        return arrayList;
    }

}
 

Zurück
Oben