Speichern auf Internen Speicher klappt nicht

  • Antworten:16
Daniel Majunke
  • Forum-Beiträge: 35

10.06.2017, 14:07:54 via Website

eigentlich ist das speichern ja recht einfach ,ich weiß auch nicht ob ich gerade ein Brett vorm Kopf habe oder nen Schlaganfall aber ich komme nicht weiter .

Ich habe das speichern in eine eigene Klasse ausgelagert .`package com.example.danie.listview.ListenAufgaben;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;

import java.io.FileOutputStream;
import java.io.IOException;

/**
* Created by danie on 08.06.2017.
*/

public class ListeSpeichern extends AppCompatActivity {
static FileOutputStream fos;

public  void speichereListe() throws IOException {


    String rueckgabe;
    String FILENAME = "hello_file";
    String string = "hello world!";

    FileOutputStream fos = openFileOutput(FILENAME,Context.MODE_PRIVATE );
    fos.write(string.getBytes());
    fos.close();


}

}`
und rufe es in der Main auf

package com.example.danie.listview.Main;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.danie.listview.ListenAufgaben.ListeSpeichern;
import com.example.danie.listview.R;
import com.example.danie.listview.activitys.ListeLoeschen;
import com.example.danie.listview.activitys.MeineEinkaufsListe;
import com.example.danie.listview.activitys.UpdateIstBestand;
import com.example.danie.listview.activitys.UpdateSollBestand;

import java.io.FileOutputStream;
import java.io.IOException;

/**
* Created by danie on 30.05.2017.
*/
// TODO XML anpassen daher die Fehler keine XMl vorhanden
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button zumLoeschen;
private Intent intent;
private Button updateIstBestand;
private Button updateSollBestand;
private Button meineEinkaufsListe;
private ListeSpeichern listeSpeichern ;
private TextView textView;
private FileOutputStream fos;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listeSpeichern = new ListeSpeichern();

    //ObjekteErzeugen();
    IdFinden();
    setClicklistener();
    try {

        listeSpeichern.speichereListe();
        textView.setText("geklappt");
    } catch (IOException e) {
        e.printStackTrace();
        textView.setText(e.toString());
    }

}

}

Das Problem was ich habe: nehme ich den Code aus der ausgelagerten Klasse und lasse ihn in der Main laufen ,funktioniert das anstandslos. Lagere ich es aber aus und erzeuge ein Objekt sagt er mir das ich auf das Objekt eine Nullpointerexeption habe.

hier der wichtige Teil des Logcats :

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.FileOutputStream android.content.Context.openFileOutput(java.lang.String, int)' on a null object reference
at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:192)
at com.example.danie.listview.ListenAufgaben.ListeSpeichern.speichereListe(ListeSpeichern.java:24)
at com.example.danie.listview.Main.MainActivity.onCreate(MainActivity.java:49)

Irgendwie kapiere ich da das Problem nicht ,vielleicht hat jemand eine Idee

— geändert am 10.06.2017, 14:11:40

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

10.06.2017, 14:21:55 via App

Hallo Daniel!
Herzlich willkommen hier im Forum :)

Ist das Absicht dass deine Klasse in der du das speichern willst eine Activity ist?
Denn du machst einfach eine neue Instanz ohne zu Berücksichtigen dass es eine Activity ist.

Activities kannst du nur mit einem Intent starten.
Da du nur eine neue Instanz machst und kein Intent ist hier der Context null, der wird für den FileStream benötigt.
Deswegen die NullPointerException ;)

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

Daniel Majunke

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

10.06.2017, 14:23:23 via Website

Ich danke dir ich werde mir das sofort anlesen !!

Ich weiß was du meinst ,ich lasse von AppCompatActivity erben ,wenn ich das aber weglasse ,meckert openFileOutput.

Aber ich hab zumindest schonmal die RIchtung

Danke Dir

— geändert am 10.06.2017, 14:26:43

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

10.06.2017, 14:28:16 via App

Ja du musst einen Context für haben:

dann kannst du es so machen:

context.openFileOutput(...);

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

Daniel Majunke

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

10.06.2017, 14:36:06 via Website

ich habe schon beim letzten Link gesehen das du wesentlich weiter bist als ich und will Dir ungern wiedersprechen ,aber so meckert er das context an.

public class ListeSpeichern {
static FileOutputStream fos;

public  void speichereListe() throws IOException {


    String rueckgabe;
    String FILENAME = "hello_file";
    String string = "hello world!";

    FileOutputStream fos =  context.openFileOutput(FILENAME,Context.MODE_PRIVATE );
    fos.write(string.getBytes());
    fos.close();


}

}
Danke für deine Geduld ;)

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

10.06.2017, 14:39:16 via App

Ich hatte angenommen dass du die Grundlagen kennst wenn du den anderen empfielst ;)

Der Context muss als Parameter in die Methode und wenn du das so machst kannst du dir die 2. Klasse sparen und das Speichern direkt in der passenden Activity ausführen.

— geändert am 10.06.2017, 14:39:30

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

Daniel Majunke

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

10.06.2017, 14:47:59 via Website

Danke für die Spitze die habe ich verdient ;) .

Wie gesagt wenn ich den Code in der passenden Activity laufen lasse ist das speichern kein Problem .
Nur will ich es ja auslagern da ich es ein paar mal brauche und halt stinkendfaul bin und es nicht jedesmal schreiben will.

Ich gucke mir Context sofort an , ich hab damit auch meine Schwierigkeiten

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

10.06.2017, 15:34:53 via Website

Habs hinbekommen .

package com.example.danie.listview.ListenAufgaben;

import android.content.Context;

import java.io.FileOutputStream;
import java.io.IOException;

/**
* Created by danie on 08.06.2017.
*/

public class ListeSpeichern {
static FileOutputStream fos;

public  void speichereListe(Context context) throws IOException {


    String rueckgabe;
    String FILENAME = "hello_file";
    String string = "hello world!";

    FileOutputStream fos =  context.openFileOutput(FILENAME,Context.MODE_PRIVATE );
    fos.write(string.getBytes());
    fos.close();


}

}

Klasse sieht jetzt so aus und in der Main übergebe ich den Context : this ;

Danke Dir .

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

10.06.2017, 22:00:26 via Website

So meinen Schreibtisch habe ich jetzt fast zerbissen.

Ich versuche gerade auszulesen , was ich im Grunde auch nicht so schwer finde ,wenn man davon absieht das es sehr umständlich ist ,die Byte wieder in Text zu wandeln und sich deswegen bei mir wahrscheinlich Shared Preferenced mehr anbietet ,aber jetzt hat mich der Ehrgeiz gepackt .

Er findet meine Datei nicht ,sagt er !! Da ich ein recht mißtrauischer Typ bin, habe ich mein Handy angeschlossen und mal meine App aufgespielt und wollte in dem Ordner schauen ob es die Datei wirklich nicht gibt .

Jetzt zu meinem Problem : Wo in Gottes Namen liegt diese App . Hab Google schon befragt und die üblichen Pfade verfolgt irgendwann bin ich zu sinnlosem durchklicken übergegangen ,das Ding gibts einfach net . Habt Ihr eine Idee.

Ps: vorne ist sie zu sehen ich kann sie auch starten.

— geändert am 10.06.2017, 22:01:30

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

10.06.2017, 22:22:04 via Website

Hehe nicht so einfach was? :P

Die App (apk) und die Preferences und Dateien die du im "internen" Speicher erstellst, kannst du vom Gerät aus ohne Root nicht auslesen.
Sie befinden sich so zu sagen in einem Geschützten Speicherbereicht, wo der nomale User nix zu suchen hat.
Willst du die Textdatei auf dem Handy lesen musst du diese in den "externen Speicher" (=USB Flash Speicher deines Gerätes) speichern. Dafür muss die App die Speicher lese/schreib berechtigung bekommen.

Und warum machst du dir es so umständlich?
Du kannst doch direkt ein Textfile rausschreiben und dieses dann wieder in einen String einlesen, das macht es ungemein einfacher ;)

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

Daniel Majunke

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

11.06.2017, 13:23:17 via Website

Das habe ich ja versucht ich finde nur extrem umständliche Anleitungen , kämpfe gerade mit Shared Preferences aber wenn man damit 4 ArrayListen speichern will die voneinander abhängen, ist es genauso grausam.

Ich habe auch schon versuche die englische Dokumentation zu lesen aber ohne Beispielcodes komme ich da nicht weiter.

Unter Java ist es sehr einfach, unter Android bekomme ich dabei echt Grippe obwohl es die gleiche Sprache ist . Ich hab ja noch den ganzen Tag Zeit und meine Frustrationsgrenze ist noch nicht erreicht ;)

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

11.06.2017, 13:29:47 via Website

Naja sobald die Stuktur zu komplex wird nehme ich wenn schon eine DB bzw. einen Serializer.
Und ArrayListen kann man speichern:
https://stackoverflow.com/questions/7057845/save-arraylist-to-sharedpreferences

Und Serialsizer/Deserializer:
https://stackoverflow.com/questions/19742103/how-do-i-serialize-an-arraylist-of-objects-and-save-it-to-a-file-in-android

Oder ganz "dumm" und altmodisch: Key-Values selber als String mit eigenenr Syntax rausschreiben und dann wieder einlesen

— geändert am 11.06.2017, 13:31:02

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

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

11.06.2017, 13:50:12 via Website

     // SCHREIBEN
    SharedPreferences prefs = getSharedPreferences("SollListe",0);
    SharedPreferences.Editor meinEditor = prefs.edit();
    SollListeArtikel = listenErzeugung.ArrayListErzeugenArtikelSoll();
    int count = SollListeArtikel.size();
    meinEditor.putInt("count",count);
    for (int i = 0; i<SollListeArtikel.size(); i++){
        meinEditor.putString("Artikel"+i,SollListeArtikel.get(i));
    }
    meinEditor.apply();

    // LESEN

    StringBuilder stringBuilder = new StringBuilder();
    List<String> ausgabe = new ArrayList<>();
    int count1 = prefs.getInt("count",0);
    for (int j = 0; j<count;j++){
        stringBuilder.append(prefs.getString("Artikel"+j,""));
    }

    //String name =prefs.getString("name","");
    textView.setText(stringBuilder);

Das ist erst mal die Lösung für die SharedPreferences ,überraschenderweise hat es auf Anhieb funktioniert bin noch ganz erstaunt .
Werde mir jetzt mal deine Links zu Gemüte führen ,wenn ich das nämlich mit 4 verschiedenen ArrayListen machen muss die alle miteinander müssen und von Benutzereingaben abhängen verknote ich mir den Kopf.
Vielen Dank für die Links ,achtet nicht auf die Syntax ,ich bin im Versuchsmodus deswegen ist auch noch auskommentierter Krempel drin.

Datenbanken kommen auch noch letztendlich möchte ich es mit jeder Möglichkeit einmal bauen ,ist zwar sinnfrei ,übt aber.

— geändert am 11.06.2017, 13:51:51

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

11.06.2017, 13:59:24 via Website

Stimmt Übung macht den Meister ;)
Also dann weiter so.

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

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

11.06.2017, 22:09:33 via Website

So der Kampf geht weiter ,

habe mir deinen Serializer heute angetan , eigentlich ist es vom Verständnis her recht logisch und auch nicht so schwer.

Schreiben funktioniert wunderbar . Läuft laut Debugger sauber durch .
Lese ich aber aus schmeisst er mir ne FileNotFoundException : Mir ist leider nicht klar warum ?.

Ich weiß auch nicht ob der restliche Code stimmt ,bis dahin komme ich leider nicht. Darum muss ich mich kümmern wenn es soweit ist.
Wenn ich es richtig verstanden habe muss ich keine Write Berechtigung setzen wenn ich nicht extern schreiben will !
Aber wenn müsste er doch beim Schreiben schon rummeckern oder habe ich das falsch verstanden ??

Hier mein Code : `package com.example.danie.schreibenundlesentextdateien;

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import com.example.danie.schreibenundlesentextdateien.listenAufgaben.ListenErzeugung;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements Serializable {
ListenErzeugung listenErzeugung = new ListenErzeugung();
ArrayList arrayList = new ArrayList();
ArrayList arrayLista = new ArrayList();
TextView textView;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    arrayList = listenErzeugung.neueListe();
    textView = (TextView)findViewById(R.id.ausgabe);
    arrayLista=new ArrayList<>();

    try {
        FileOutputStream fos = this.openFileOutput("SollListe", Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(arrayList);
        oos.close();
        textView.setText("Hat geklappt ");
    } catch (Exception e) {
        e.printStackTrace();
        textView.setText("Mööp");
    }

    try {
        FileInputStream fis = new FileInputStream("SollListe");
        ObjectInputStream ois = new ObjectInputStream(fis);
        arrayLista = (ArrayList<String>;) ois.readObject();
        textView.setText(arrayLista.size());

    }catch (Exception e){
      textView.setText(e.toString());
    }


}

}`

Ich hoffe Ihr könnt mir nen Tip geben was ich verbessern muss .
Der Cast wird wohl falsch dargestellt der Smiley ist keine Absicht ;).

Antworten
Daniel Majunke
  • Forum-Beiträge: 35

11.06.2017, 22:26:27 via Website

Danke manchmal ist es wie verhext ,da grübelste ne halbe Stunde und nix klickt ,du schreibst es in das Forum und dann machts klick und du bekommst es hin .

Für alle die es vielleicht interressiert hier mein Code :

Kann ich leider nicht posten weil mir das Forum erklärt ,das die identisch sind ,voll der Lügenbold :
es ist aber schon recht das gleiche

Habe nur das getauscht : this.openFileInput("SollListe"); und verwende zum Ausgeben einfach nen Stringbuilder und eine For Schleife

Ich danke euch für eure Geduld und die guten Tips .

Antworten