Dateien Speichern

Dieses Thema Dateien Speichern im Forum "Mobile Geräte" wurde erstellt von Battleju, 24. Dez. 2016.

Thema: Dateien Speichern Hi, ich bin beim Programmieren mit Java noch sehr unerfahren. Ich versuche ein Spiel für Android zu programmieren....

  1. Hi,
    ich bin beim Programmieren mit Java noch sehr unerfahren. Ich versuche ein Spiel für Android zu programmieren. Dabei sollen Variablen gespeichert werden, um nach einem erneuten Starten der App nicht von vorne anfangen zu müssen. Jedoch schließt sich die App("App wurde leider beendet"). Mit dem Debugger komm folgender Fehler:
    Ich überlege nun seit Stunden und finde die Ursache nicht...:(
    Ich hoffe ihr könnt mir helfen.
    Kompletter Soure code:
    (1. class)
    Code (Java):
    package ihack.battl.de.ihack;

    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.view.View.OnClickListener;
    import android.widget.Toast;

    public class Start extends AppCompatActivity implements OnClickListener {
          Button boption1,boption2,hilfe;
          static SharedPreferences speicher;
          static Editor editor;

        static int savewert=0;
        static int test;
        static float bitstart,syslvl,kdollar,dollarmulti,score,bitcoin,przwert,grakawert;
        static float prz,twertgegner,twertspieler,adwertspieler,swertspieler,x,option1z,option2,option2_1,option3,option4,swertgegner1,twertgegner1,adwertgegner1,gdollar1,score1,escore1,swertgegner2,twertgegner2,adwertgegner2,gdollar2,score2,escore2,swertgegner3,twertgegner3,adwertgegner3,gdollar3,score3,escore3;
        static int przmulti,agswwert,prgswwert;
        static int preis1,preis2,preis3,preis4;
        static long psccode,altpsccode;
        static float angpsccode;

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

            boption1= (Button)findViewById(R.id.bNeuesSpiel);
            boption2= (Button)findViewById(R.id.bSpielLaden);
            hilfe = (Button)findViewById(R.id.bHilfe);


            boption1.setOnClickListener(this);
            boption2.setOnClickListener(this);
            hilfe.setOnClickListener(this);

            speicher = getApplicationContext().getSharedPreferences("Wert",0);
            if(1 == savewert){
                editor.putInt("Data1",preis1);
                editor.commit();
                editor.putInt("Data2",preis2);
                editor.commit();
                editor.putInt("Data3",preis3);
                editor.commit();
                editor.putInt("Data4",preis4);
                editor.commit();
                editor.putFloat("Data5",x);
                editor.commit();
                editor.putFloat("Data6",bitstart);
                editor.commit();
                editor.putFloat("Data7",syslvl);
                editor.commit();
                editor.putFloat("Data8",kdollar);
                editor.commit();
                editor.putFloat("Data9",dollarmulti);
                editor.commit();
                editor.putFloat("Data10",score);
                editor.commit();
                editor.putFloat("Data11",bitcoin);
                editor.commit();
                editor.putFloat("Data12",przwert);
                editor.commit();
                editor.putFloat("Data13",grakawert);
                editor.commit();
                editor.putInt("Data14",przmulti);
                editor.commit();
                editor.putInt("Data15",agswwert);
                editor.commit();
                editor.putInt("Data16",prgswwert);
                editor.commit();
                editor.putLong("Data17",psccode);
                editor.commit();
                editor.putLong("Data18",altpsccode);
                editor.commit();
                editor.putInt("TestData",test);
                editor.commit();
                Toast.makeText(this, "Spielstand gespeichert",Toast.LENGTH_LONG).show();
            }
        }

        public void onClick(View e){
            int eingabe = e.getId();
            if(eingabe==R.id.bNeuesSpiel){
                test= 1;
                preis1=2;
                preis2=3;
                preis3=1;
                preis4=1;
                przwert= (float) 0.1;
                przmulti=1;
                agswwert=1;
                prgswwert=1;
                grakawert=150;
                dollarmulti=1;
                x=1;
                syslvl=1;
                kdollar=100;
                score=0;
                bitstart=0;
                bitcoin=0;
                psccode=0;
                altpsccode=0;

                Intent intent = new Intent(Start.this, game.class);
                startActivity(intent);
            }
            if(eingabe==R.id.bSpielLaden) {
                if(speicher.getInt("TestData",0)!=0){
                    speicher.getInt("Data1",preis1);
                    speicher.getInt("Data2",preis2);
                    speicher.getInt("Data3",preis3);
                    speicher.getInt("Data4",preis4);
                    speicher.getFloat("Data5",x);
                    speicher.getFloat("Data6",bitstart);
                    speicher.getFloat("Data7",syslvl);
                    speicher.getFloat("Data8",kdollar);
                    speicher.getFloat("Data9",dollarmulti);
                    speicher.getFloat("Data10",score);
                    speicher.getFloat("Data11",bitcoin);
                    speicher.getFloat("Data12",przwert);
                    speicher.getFloat("Data13",grakawert);
                    speicher.getInt("Data14",przmulti);
                    speicher.getInt("Data15",agswwert);
                    speicher.getInt("Data16",prgswwert);
                    speicher.getLong("Data17",psccode);
                    speicher.getLong("Data18",altpsccode);
                    Intent intent = new Intent(Start.this, game.class);
                    startActivity(intent);
                }else{
                    Toast.makeText(this, "Kein Spielstand vorhanden",Toast.LENGTH_LONG).show();
                }

            }

        }
        public static void speichern(){
            editor.putInt("Data1",preis1);
            editor.putInt("Data2",preis2);
            editor.putInt("Data3",preis3);
            editor.putInt("Data4",preis4);
            editor.putFloat("Data5",x);
            editor.putFloat("Data6",bitstart);
            editor.putFloat("Data7",syslvl);
            editor.putFloat("Data8",kdollar);
            editor.putFloat("Data9",dollarmulti);
            editor.putFloat("Data10",score);
            editor.putFloat("Data11",bitcoin);
            editor.putFloat("Data12",przwert);
            editor.putFloat("Data13",grakawert);
            editor.putInt("Data14",przmulti);
            editor.putInt("Data15",agswwert);
            editor.putInt("Data16",prgswwert);
            editor.putLong("Data17",psccode);
            editor.putLong("Data18",altpsccode);
            editor.putInt("TestData",test);
        }
    (2. class)
    Code (Java):
    package ihack.battl.de.ihack;


    import android.app.Activity;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.view.View.OnClickListener;


    import static ihack.battl.de.ihack.Start.adwertspieler;
    import static ihack.battl.de.ihack.Start.agswwert;
    import static ihack.battl.de.ihack.Start.altpsccode;
    import static ihack.battl.de.ihack.Start.bitcoin;
    import static ihack.battl.de.ihack.Start.bitstart;
    import static ihack.battl.de.ihack.Start.dollarmulti;
    import static ihack.battl.de.ihack.Start.grakawert;
    import static ihack.battl.de.ihack.Start.kdollar;
    import static ihack.battl.de.ihack.Start.preis1;
    import static ihack.battl.de.ihack.Start.preis2;
    import static ihack.battl.de.ihack.Start.preis3;
    import static ihack.battl.de.ihack.Start.preis4;
    import static ihack.battl.de.ihack.Start.prgswwert;
    import static ihack.battl.de.ihack.Start.prz;
    import static ihack.battl.de.ihack.Start.przmulti;
    import static ihack.battl.de.ihack.Start.przwert;
    import static ihack.battl.de.ihack.Start.psccode;
    import static ihack.battl.de.ihack.Start.score;
    import static ihack.battl.de.ihack.Start.speichern;
    import static ihack.battl.de.ihack.Start.swertspieler;
    import static ihack.battl.de.ihack.Start.syslvl;
    import static ihack.battl.de.ihack.Start.test;
    import static ihack.battl.de.ihack.Start.twertspieler;
    import static ihack.battl.de.ihack.Start.x;
    import ihack.battl.de.ihack.Start;
    public class game extends AppCompatActivity implements OnClickListener {

        Button b,bs;



        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            var();
            setContentView(R.layout.activity_game_menue);
            TextView textView = (TextView) findViewById(R.id.werte);
            textView.setText("Systemlevel: " + syslvl + "\nScanwert: " + swertspieler + "\nTrojanawert: " + twertspieler + "\nAdwarewert: " + adwertspieler + "\n" + kdollar + "Dollar im Besitz");
            b= (Button)findViewById(R.id.b);
            bs=(Button)findViewById(R.id.save);
            b.setOnClickListener(this);
            bs.setOnClickListener(this);


        }
        public void var(){
            kdollar= (float) (Math.round(100.0 * kdollar) / 100.0);
            if (bitstart==1)
            {
                bitcoin+=grakawert/100000;
            } // end of if bitminer

            prz=przwert*przmulti;
            swertspieler=agswwert+100+(syslvl*(prz/5));
            twertspieler=prgswwert+100+(syslvl*(prz/5));
            adwertspieler=prgswwert+100+(syslvl*(prz/5));
            syslvl= (swertspieler+twertspieler+adwertspieler)/3/100;
            syslvl = (float) (Math.round(syslvl*1)/1.0);
        }

        @Override
        public void onClick(View v) {
            int eingabe = v.getId();
            if(eingabe==R.id.b) {
                kdollar += 100;
                Intent intent = new Intent(game.this, game.class);
                startActivity(intent);
            }
            if(eingabe==R.id.save){
                speichern();
                Intent intent = new Intent(game.this, Start.class);
                startActivity(intent);

            }
        }
    }

     
    Dieses Game ist noch am Anfang. Dadurch könnten einige Befehle sinnlos wirken.
     
  2. Vielleicht hilft dir das Java-Tutorial weiter. Hier klicken --> (Klick)
  3. Hey :)

    Das passt in der Regel nicht zusammen. Setze dich erstmal mit den Basics von Java auseinander und fang' dann an Apps zu programmieren. So wirst du einiges nicht verstehen was dort eigentlich im Hintergrund passiert.

    Zu deinem Problem:

    Ich nehme mal an, dass Zeile 141 folgende ist:
    Code (Java):

    editor.putInt("Data1",preis1);
     
    Du bekommst eine NPE, da du hier das erste mal versuchst auf ein Objekt zuzugreifen, was du nirgends initialisiert hast.
    Generell initialisierst du ein SharedPreferences.Editor so:

    Code (Java):


    SharedPreferences sharedPref  = ...


    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt(.., ..);

     
    Das ganze musst du in deinen Code einfügen bevor du das erste mal editor.putInt() o.ä. Methoden aufrufst :)

    Gruß
    Robert
     
  4. Danke, ich habe die Initialisierung gemacht. Ich habe es getestet und es funktioniert. Doch wenn ich die App neustarte, sind die Werte nicht mehr gespeichert. Habe ich etwas falsch gemacht oder habe ich die Erklärung zu dem Befehl das falsch verstanden?
     
  5. In der Methode speichern() fehlt am Ende noch das editor.commit(), oder besser editor.apply()
    walex
     
  6. Hier nochmal mein überarbeiteter Source Code:
    Code (Java):
    package ihack.battl.de.ihack;

    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.view.View.OnClickListener;
    import android.widget.Toast;

    public class Start extends AppCompatActivity implements OnClickListener {
          Button boption1,boption2,hilfe;
          static SharedPreferences speicher;
          static Editor editor;

        static int savewert=0;
        static int test;
        static float bitstart,syslvl,kdollar,dollarmulti,score,bitcoin,przwert,grakawert;
        static float prz,twertgegner,twertspieler,adwertspieler,swertspieler,x,option1z,option2,option2_1,option3,option4,swertgegner1,twertgegner1,adwertgegner1,gdollar1,score1,escore1,swertgegner2,twertgegner2,adwertgegner2,gdollar2,score2,escore2,swertgegner3,twertgegner3,adwertgegner3,gdollar3,score3,escore3;
        static int przmulti,agswwert,prgswwert;
        static int preis1,preis2,preis3,preis4;
        static long psccode,altpsccode;
        static float angpsccode;

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

            boption1= (Button)findViewById(R.id.bNeuesSpiel);
            boption2= (Button)findViewById(R.id.bSpielLaden);
            hilfe = (Button)findViewById(R.id.bHilfe);


            boption1.setOnClickListener(this);
            boption2.setOnClickListener(this);
            hilfe.setOnClickListener(this);

            speicher = getApplicationContext().getSharedPreferences("Wert",0);
            editor = speicher.edit();

        }

        public void onClick(View e){
            int eingabe = e.getId();
            if(eingabe==R.id.bNeuesSpiel){
                test= 1;
                preis1=2;
                preis2=3;
                preis3=1;
                preis4=1;
                przwert= (float) 0.1;
                przmulti=1;
                agswwert=1;
                prgswwert=1;
                grakawert=150;
                dollarmulti=1;
                x=1;
                syslvl=1;
                kdollar=100;
                score=0;
                bitstart=0;
                bitcoin=0;
                psccode=0;
                altpsccode=0;

                Intent intent = new Intent(Start.this, game.class);
                startActivity(intent);
            }
            if(eingabe==R.id.bSpielLaden) {
                if(speicher.getInt("TestData",1)!=0){
                    speicher.getInt("Data1",preis1);
                    speicher.getInt("Data2",preis2);
                    speicher.getInt("Data3",preis3);
                    speicher.getInt("Data4",preis4);
                    speicher.getFloat("Data5",x);
                    speicher.getFloat("Data6",bitstart);
                    speicher.getFloat("Data7",syslvl);
                    speicher.getFloat("Data8",kdollar);
                    speicher.getFloat("Data9",dollarmulti);
                    speicher.getFloat("Data10",score);
                    speicher.getFloat("Data11",bitcoin);
                    speicher.getFloat("Data12",przwert);
                    speicher.getFloat("Data13",grakawert);
                    speicher.getInt("Data14",przmulti);
                    speicher.getInt("Data15",agswwert);
                    speicher.getInt("Data16",prgswwert);
                    speicher.getLong("Data17",psccode);
                    speicher.getLong("Data18",altpsccode);
                    Intent intent = new Intent(Start.this, game.class);
                    startActivity(intent);
                }else{
                    Toast.makeText(this, "Kein Spielstand vorhanden",Toast.LENGTH_LONG).show();
                }

            }

        }
        public static void speichern(){
            editor.putInt("Data1",preis1);
            editor.apply();
            editor.putInt("Data2",preis2);
            editor.apply();
            editor.putInt("Data3",preis3);
            editor.apply();
            editor.putInt("Data4",preis4);
            editor.apply();
            editor.putFloat("Data5",x);
            editor.apply();
            editor.putFloat("Data6",bitstart);
            editor.apply();
            editor.putFloat("Data7",syslvl);
            editor.apply();
            editor.putFloat("Data8",kdollar);
            editor.apply();
            editor.putFloat("Data9",dollarmulti);
            editor.apply();
            editor.putFloat("Data10",score);
            editor.apply();
            editor.putFloat("Data11",bitcoin);
            editor.apply();
            editor.putFloat("Data12",przwert);
            editor.apply();
            editor.putFloat("Data13",grakawert);
            editor.apply();
            editor.putInt("Data14",przmulti);
            editor.apply();
            editor.putInt("Data15",agswwert);
            editor.apply();
            editor.putInt("Data16",prgswwert);
            editor.apply();
            editor.putLong("Data17",psccode);
            editor.apply();
            editor.putLong("Data18",altpsccode);
            editor.apply();
            editor.putInt("TestData",test);
            editor.apply();
        }

    }
     
    Code (Java):
    package ihack.battl.de.ihack;


    import android.app.Activity;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.view.View.OnClickListener;


    import static ihack.battl.de.ihack.Start.adwertspieler;
    import static ihack.battl.de.ihack.Start.agswwert;
    import static ihack.battl.de.ihack.Start.altpsccode;
    import static ihack.battl.de.ihack.Start.bitcoin;
    import static ihack.battl.de.ihack.Start.bitstart;
    import static ihack.battl.de.ihack.Start.dollarmulti;
    import static ihack.battl.de.ihack.Start.grakawert;
    import static ihack.battl.de.ihack.Start.kdollar;
    import static ihack.battl.de.ihack.Start.preis1;
    import static ihack.battl.de.ihack.Start.preis2;
    import static ihack.battl.de.ihack.Start.preis3;
    import static ihack.battl.de.ihack.Start.preis4;
    import static ihack.battl.de.ihack.Start.prgswwert;
    import static ihack.battl.de.ihack.Start.prz;
    import static ihack.battl.de.ihack.Start.przmulti;
    import static ihack.battl.de.ihack.Start.przwert;
    import static ihack.battl.de.ihack.Start.psccode;
    import static ihack.battl.de.ihack.Start.score;
    import static ihack.battl.de.ihack.Start.speichern;
    import static ihack.battl.de.ihack.Start.swertspieler;
    import static ihack.battl.de.ihack.Start.syslvl;
    import static ihack.battl.de.ihack.Start.test;
    import static ihack.battl.de.ihack.Start.twertspieler;
    import static ihack.battl.de.ihack.Start.x;
    import ihack.battl.de.ihack.Start;
    public class game extends AppCompatActivity implements OnClickListener {

        Button b,bs;



        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            var();
            setContentView(R.layout.activity_game_menue);
            TextView textView = (TextView) findViewById(R.id.werte);
            textView.setText("Systemlevel: " + syslvl + "\nScanwert: " + swertspieler + "\nTrojanawert: " + twertspieler + "\nAdwarewert: " + adwertspieler + "\n" + kdollar + "Dollar im Besitz");
            b= (Button)findViewById(R.id.b);
            bs=(Button)findViewById(R.id.save);
            b.setOnClickListener(this);
            bs.setOnClickListener(this);


        }
        public void var(){
            kdollar= (float) (Math.round(100.0 * kdollar) / 100.0);
            if (bitstart==1)
            {
                bitcoin+=grakawert/100000;
            } // end of if bitminer

            prz=przwert*przmulti;
            swertspieler=agswwert+100+(syslvl*(prz/5));
            twertspieler=prgswwert+100+(syslvl*(prz/5));
            adwertspieler=prgswwert+100+(syslvl*(prz/5));
            syslvl= (swertspieler+twertspieler+adwertspieler)/3/100;
            syslvl = (float) (Math.round(syslvl*1)/1.0);
        }

        @Override
        public void onClick(View v) {
            int eingabe = v.getId();
            if(eingabe==R.id.b) {
                kdollar += 100;
                Intent intent = new Intent(game.this, game.class);
                startActivity(intent);
            }
            if(eingabe==R.id.save){
                speichern();
                Intent intent = new Intent(game.this, Start.class);
                startActivity(intent);
                test = 1;

            }
        }
    }



     
    Die App funktioniert, jedoch bleiben die Dateien nach einem Neustart der App nicht erhalten.
     
  7. Doch, doch, die Daten werden sicherlich gespeichert.
    Aber Du solltest beim einlesen die Daten auch den Variablen zuweisen und nicht das Ergebnis ignorieren.
    Bsp,
    speicher.getInt("Data1",preis1) sollte eher heissen
    preis1 = speicher.getInt("Data1",2)
    Die 2 ist der Default-Wert.
    Walex
     
  8. Okay, danke. Ich habe es gemacht und jetzt funktioniert es. :)
     
  9. Schau dir jetzt hier den Kurs an und lernen Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)