# Daten bzw Objekte auf das Handy lokal speichern



## Panda9296 (21. Jun 2020)

Hi ich versuche folgendes Objekt zu speichern und finde einfach keine Lösung wie das gehen soll. Ich möchte keine Datenbank sondern die Accountinfos sollen so einfach wie es geht aufs handy gespeichert werden. Ich möchte mit den Daten arbeiten also zu diesem User sollen dann noch andere Sachen hinzugefügt werden


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class Register extends AppCompatActivity {

    private static final String TAG = Register.class.getSimpleName();
    private static final String FILENAME= TAG+ "database.txt";


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

    public void Register(View view) {
        //decliation
        String input;
        String inputE;
        String inputP;
        String inputControlP;
        Counter counter = null;
        SharedPreferences mySPR;

        int inputID;
        User user =new User();
        String userData;



        //source
        EditText inputName= (EditText)findViewById(R.id.bntInputName);
        EditText inputEmail=(EditText)findViewById(R.id.bntInputEmail);
        EditText setPasswort=(EditText)findViewById(R.id.bntsetPasswort);
        EditText setControlPasswort=(EditText)findViewById(R.id.bntControlPasswort);


        //set to User
        input= (inputName.getText().toString());
        inputE= (inputEmail.getText().toString());
        inputP= (setPasswort.getText().toString());
        inputControlP=(setControlPasswort.getText().toString());


       user.setUserName(input);
       user.setEmail(inputE);
        if(input.equals(inputControlP)){
            user.setPasswort(inputP);
        }
        inputID=counter.getId();
        user.setUserID(inputID);
        userData= user.toString();

       


    }

  }
```


----------



## mihe7 (21. Jun 2020)

Zum Beispiel: https://developer.android.com/training/data-storage/shared-preferences


----------



## Panda9296 (21. Jun 2020)

mihe7 hat gesagt.:


> Zum Beispiel: https://developer.android.com/training/data-storage/shared-preferences



Das wäre jetzt die Vorlage. Das heisst so wie ich das verstehe müsste ich jetzt die UserID bei "edtor.putint("USERID",variable was auch immer hier rein kommt) setzen? Weil ich habe es schonmal versucht und irgendwie will er mir den User nicht speichern. Ich denke, da es mein erstes mal ist das ich das machen möchte, dass ich irgenwie ein Denkfehler habe. Ich muss aber schon das Objekt als String einspeichern? 


```
// Called when user click to Save button.
    public void doSave(View view)  {
        // The created file can only be accessed by the calling application
        // (or all applications sharing the same user ID).
        SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);
 
        SharedPreferences.Editor editor = sharedPreferences.edit();
 
        editor.putInt("brightness", this.seekBarBrightness.getProgress());
        editor.putInt("sound", this.seekBarSound.getProgress());
 
        // Checked RadioButton ID.
        int checkedRadioButtonId = radioGroupDiffLevel.getCheckedRadioButtonId();
 
        editor.putInt("checkedRadioButtonId", checkedRadioButtonId);
 
        // Save.
        editor.apply();
 
        Toast.makeText(this,"Game Setting saved!",Toast.LENGTH_LONG).show();
    }
```


----------



## mihe7 (21. Jun 2020)

Panda9296 hat gesagt.:


> Ich muss aber schon das Objekt als String einspeichern?


Was heißt Objekt als String? Es werden halt nur bestimmte Typen unterstützt. Der Code sieht doch gar nicht schlecht aus.



Panda9296 hat gesagt.:


> Das heisst so wie ich das verstehe müsste ich jetzt die UserID bei "edtor.putint("USERID",variable was auch immer hier rein kommt) setzen?


Ja, wenn die User-ID ein int ist.


----------



## Panda9296 (21. Jun 2020)

Ich weiß das hört sich echt doof an, aber ich verzweifle seit gestern um 10 Uhr morgens daran  Der PC ist also schon fast fliegen gelernt ^^. Ich verstehe nicht so ganz was da genau passiert. Ich habe mir das durchgelesen. Es geht darum einen User beim regristrieren zu speichern. Gut ich habe bereits eine UserID gesetzt die habe ich jetzt so gespeichert:


```
editor.putString("inputiD",userData);
        editor.commit();
```
Dabei ist die userData der User mit toString... also die Attribute sind in einem String wie folgt verpackt:


```
public String toString() {
        return "#" + userID + "#" + userName + "#" + passwort + "#" + email
                + "#";
    }
```

so ich müsste das doch jetzt irgendwie sehen und vor allem, wenn ich das gespeichert habe und es damit funktioniert hätte, müsste ich doch den login einfach gestalten können.

Wenn es eingespeichert ist müsste es nach meinem Verständnis von :

```
editor.putString("inputiD",userData);
        editor.commit();
```

(also das habe ich jetzt nach dem Schema vom Guide eingetragen)unter der ID inputID gespeichert sein und unter der ID müsste der string eingespeichert sein... Wo finde ich das, wenn es so ist, da ich ja jetzt den login machen möchte, wo ich diese ID suchen muss. nur wo suche ich sie. Habe ich überhaupt mit dem Befehl :


```
SharedPreferences sharedPreferences= this.getSharedPreferences("User.txt",0);
```
die Datei User.txt erzeugt^^?


----------



## mihe7 (21. Jun 2020)

Naja, wenn Du auf die Daten wieder zugreifen willst, holst Du Dir die SharedPreferences 

```
SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);
```
und liest sie aus:

```
int brightness = sharedPreferences.getInt("brightness");
```
(Um mal bei Deinem Beispiel aus Kommentar #3 zu bleiben).


----------



## Panda9296 (21. Jun 2020)

mihe7 hat gesagt.:


> Naja, wenn Du auf die Daten wieder zugreifen willst, holst Du Dir die SharedPreferences
> 
> ```
> SharedPreferences sharedPreferences= this.getSharedPreferences("gameSetting", Context.MODE_PRIVATE);
> ...


Kann man den sharedPreferences dann auch in einer anderen Activity öffnen? Für den Log in also


----------



## mihe7 (21. Jun 2020)

Natürlich. Die SharedPreferences sind das, was Du normalerweise in den Optionen der App einstellst. Verwendet werden die dann an unterschiedlichen Stellen in der App.


----------



## Panda9296 (21. Jun 2020)

ok. Hast du vielleicht deutsche Quellen? Das ich vielleicht nochmal auf deutsch nachlesen kann, da es so nicht funktioniert ^^ . Ich muss da wohl nochmal genauer kucken


----------



## mihe7 (21. Jun 2020)

Nein, deutsche Quellen habe ich nicht. Du musst halt in Deiner Activity Dir die gleichen SharedPreferences holen.


----------



## Panda9296 (22. Jun 2020)

mihe7 hat gesagt.:


> Nein, deutsche Quellen habe ich nicht. Du musst halt in Deiner Activity Dir die gleichen SharedPreferences holen.


Leider ist es einfach nicht möglich, da der Compoiler in jeder Variation einen Fehler schmeisst: Sicher das es so geht?
Ich kann die Daten jedenfalls nicht holen so wie du es beschreibst =( 


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnRegister;
    Button btnSignIn;
    int userID;
    SharedPreferences sharedPreferences;

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

        btnRegister= (Button)findViewById(R.id.bntRegister);
        btnRegister.setOnClickListener(this);
        btnSignIn= (Button)findViewById(R.id.bntSignIn);

        // sign in condition
        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                EditText inputName= (EditText)findViewById(R.id.bntViewEmail);
                EditText inputPasswort= (EditText)findViewById(R.id.btnViewPasswort);
                // Shared Preferencs

                sharedPreferences= getActivity().getSharedPreferences("userID",Context.MODE_PRIVATE);

                
            }
        });

    }
     //register button
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this,Register.class);
        startActivity(intent);

    }
```
er akzeptiert die getActivity nicht. Ich habe es mit einem intent probiert... er erkennt den initialisierten Intent nicht.


Die Regrstry müsste richtig sein und da hat auch laut code alles geklappt...


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.SharedPreferencesCompat;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Register extends AppCompatActivity implements View.OnClickListener {

    SharedPreferences sharedPreferences;

    Button regristryFinish;



    int inputID;
    User user =new User();
    String userData;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        regristryFinish=(Button)findViewById(R.id.btnRegistry);
        regristryFinish.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {


        //decliation
        String input;
        String inputE;
        String inputP;
        String inputControlP;
        Counter counter = null;



        //source
        EditText inputName= (EditText)findViewById(R.id.bntInputName);
        EditText inputEmail=(EditText)findViewById(R.id.bntInputEmail);
        EditText setPasswort=(EditText)findViewById(R.id.bntsetPasswort);
        EditText setControlPasswort=(EditText)findViewById(R.id.bntControlPasswort);
        TextView inputAnswer=(TextView) findViewById(R.id.btnAnswer);




        //set to User
        input= (inputName.getText().toString());
        inputE= (inputEmail.getText().toString());
        inputP= (setPasswort.getText().toString());
        inputControlP=(setControlPasswort.getText().toString());


       user.setUserName(input);
       user.setEmail(inputE);
        if(input.equals(inputControlP)){
            user.setPasswort(inputP);
        }
        else {
            inputAnswer.setText("Passwörter stimmen nicht überein");
        }


        inputID=counter.getId();
        user.setUserID(inputID);
        userData= user.toString();
        sharedPreferences= this.getSharedPreferences("User.txt",0);
        SharedPreferences.Editor editor=sharedPreferences.edit();

        inputAnswer.setText("Regristration erfolgreich!");
        editor.putString("inputiD",userData);
        editor.commit();

        Intent intent= new Intent(this,MainActivity.class);
        startActivity(intent);

    }


}
```


----------



## mihe7 (22. Jun 2020)

Panda9296 hat gesagt.:


> er akzeptiert die getActivity nicht.


Natürlich nicht. Du bist in einem Listener, da es sich aber um eine anonyme innere Klasse in der MainActivity handelt, kannst Du auf das MainActivity-Objekt per MainActivity.this zugreifen: `MainActivity.this.getSharedPreferences(...)` im Listener sollte also funktionieren.

Nachtrag: außerdem kannst Du sharedPreferences außerhalb des Listeners initialisieren.


----------



## Panda9296 (22. Jun 2020)

okay interessant dieses android ^^ aber ich kann dann diesen Zugriff noch nicht als String bearbeiten? Dazu müsste ich dann sagen

String user = sharedPreferences.getString("userID");
und dann kann ich den wie in den Grundlagen von Java bearbeiten? bzw auslesen weil ich ja überprüfen möchte, ob die daten übereinstimmen.

Ich hab das alles halt nur in java und ohne speicherung von daten gemacht deswegen bin ich dabei voll lost


----------



## mihe7 (22. Jun 2020)

Panda9296 hat gesagt.:


> okay interessant dieses android


Das hat jetzt wiederum nichts mit Android zu tun  

Mit `new View.OnClickListener() {` erzeugst Du eine anonyme Klasse, die von View.OnClickListener abgeleitet ist. 

Die Methode `public void onClick(View view) {` ist Teil dieser Klasse, dem entsprechend zeigt this dort nicht auf das MainActivity-Objekt sondern auf das Objekt der anonymen Klasse (d. h. den OnClickListener, den Du gerade mit new erzeugt hast). 

Da die umschließende Klasse die MainActivity ist, kannst Du jedoch auf das Objekt der MainActivity via `MainActivity.this` zugreifen. Das ist alles Standard-Java.



```
class A {
    class B {
        // hier bezieht sich this auf ein B-Objekt
        // man kann aber per A.this auf das umschließende A-Objekt zugreifen
    }

    // hier bezieht sich this auf ein A-Objekt
}
```




Panda9296 hat gesagt.:


> Dazu müsste ich dann sagen
> 
> String user = sharedPreferences.getString("userID");
> 
> und dann kann ich den wie in den Grundlagen von Java bearbeiten? bzw auslesen weil ich ja überprüfen möchte, ob die daten übereinstimmen.


Klar, Du hast ein SharedPreferences-Objekt und das kannst Du ganz normal verwenden.

Der Unterschied zwischen Android und Java auf dem Desktop liegt nicht in der Sprache, sondern im Framework (und den Paketen, die zur Verfügung stehen). Die Sprache ist immer gleich und funktioniert immer gleich. 

Das Framework ist einfach schon sehr verschieden vom Desktop. Die strikte Entkopplung von Activities über Intents und Broadcasts z. B. ist für Desktop-Programmierer erstmal sehr ungewöhnlich. Dann ist auf die Verwendung des richtigen Contexts zu achten. Auch, dass das Framework aktiv ins Geschehen eingreift, ist strange. Insofern ist es wichtig, sich an die Vorgaben von Android zu halten, sonst entsteht Murks, der zwar halbwegs funktioniert, aber in bestimmten Situationen einfach crasht.


----------



## Panda9296 (22. Jun 2020)

Also das, was du jetzt von Java beschreibst ist mir bekannt. Zumindest von Java^^. Ich habe jetzt mal versucht alles zu befolgen 
Ich bin auch tatsächlich weiter gekommen bis ich versucht habe den String zu zerlegen. Also was vielleicht auf dein Muster nicht zutrifft ist, dass die Registrierung ja in einer anderen aktivity stattfindet. Das ding dabei ist jetzt natürlich. Warum crasht es jetzt, weil ich mir sicher bin, dass ich den String richtig zerlegt habe. Ich denke es hat aufjedenfall was mit android zu tun. Also sobald ich daten eingebe crasht es -.-.


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.Arrays;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnRegister;
    Button btnSignIn;
    int userID;
    SharedPreferences sharedPreferences;
    String user;

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

        btnRegister= (Button)findViewById(R.id.bntRegister);
        btnRegister.setOnClickListener(this);
        btnSignIn= (Button)findViewById(R.id.bntSignIn);

        // sign in condition
        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                EditText inputEmail= (EditText)findViewById(R.id.bntViewEmail);
                EditText inputPasswort= (EditText)findViewById(R.id.btnViewPasswort);
                // Shared Preferencs

                sharedPreferences= MainActivity.this.getSharedPreferences
                                               ("userID",Context.MODE_PRIVATE);
                String email = inputEmail.getText().toString();
                String passwort= inputPasswort.getText().toString();
                user = sharedPreferences.toString();
                if(email.isEmpty()){
                    inputEmail.setError("bitte Email eingeben");
                    inputEmail.requestFocus();
                }
                else if(passwort.isEmpty()){
                    inputPasswort.setError("Bitte geben Sie ein Passwort ein");
                    inputPasswort.requestFocus();
                }
                else if(!email.isEmpty()&&!passwort.isEmpty()){
                    for(int i=0;i<user.length();i++){
                       String userAddributs[]=  user.split("#");
                        Arrays.toString(userAddributs);
                        if(email.equals(userAddributs[2])&&passwort.equals(userAddributs[3])){
                            Intent intent= new Intent(MainActivity.this,
                                                                     FreezerManagment.class);
                            startActivity(intent);
                        }else if(!email.equals(userAddributs[2])){
                            inputEmail.setError("Emailadresse stimmt nicht überein.");
                        }else if(!passwort.equals(userAddributs[3])){
                            inputPasswort.setError("Passwort stimmt nicht überein.");
                        }
                    }
                }
            }
        });

    }
     //register button
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this,Register.class);
        startActivity(intent);

    }
}
```


----------



## mihe7 (22. Jun 2020)

Schau mal ins Stacktrace, da steht genau, in welcher Zeile es crasht und in der Regel auch ein Hinweis darauf, warum.


----------



## mihe7 (22. Jun 2020)

Ei, ei, ei, jetzt sehe ich das erst. Da stimmt ja gar nichts zusammen:

1. Du musst schon die gleichen Preferences laden, die Du zuvor gespeichert hast.

sharedPreferences= this.getSharedPreferences("User.txt",0);
vs. 
sharedPreferences= MainActivity.this.getSharedPreferences("userID",Context.MODE_PRIVATE);

User.txt ist nicht "userID".

2. user = sharedPreferences.toString(); -- was soll das werden?

3. hast Du editor.putString("inputiD",userData); verwendet, dann musst Du auch den Key "inputiD" verwenden, um an die Daten heranzukommen.

`String userData = sharedPreferences.getString("inputiD");`


----------



## Panda9296 (22. Jun 2020)

Okay. also das erste habe ich gemacht weil... naja ich habe einfach falsch gedacht. Ich denke es muss immer eine Datei erzeugt werden. Ich dachte ich muss mit 

```
sharedPreferences= this.getSharedPreferences("user.txt",0);
```
eine Datei erzeugen.
Es wird aber in xml eingespeichert also ... ja.
So wie ich das verstehe muss die zeile also natürlich in "inputID"gewechselt werden... soweit so gut. 
1b.Im Code habe ich vergessen das Array in dem ich den Userstring eingespeichert habe auch abzufragen.. hab ich gefunden.
2.ja ein dummer gedanke den string nochmal extra einzuspeichern
3. in der MainActivity habe ich es überarbeitet:

```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.Arrays;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnRegister;
    Button btnSignIn;
    SharedPreferences sharedPreferences;
    String user;

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

        btnRegister= (Button)findViewById(R.id.bntRegister);
        btnRegister.setOnClickListener(this);
        btnSignIn= (Button)findViewById(R.id.bntSignIn);

        // sign in condition
        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                EditText inputEmail= (EditText)findViewById(R.id.bntViewEmail);
                EditText inputPasswort= (EditText)findViewById(R.id.btnViewPasswort);
                // Shared Preferencs

                sharedPreferences= MainActivity.this.getSharedPreferences
                                               ("userID",Context.MODE_PRIVATE);
                String email = inputEmail.getText().toString();
                String passwort= inputPasswort.getText().toString();

                if(email.isEmpty()){
                    inputEmail.setError("Bitte Email eingeben");
                    inputEmail.requestFocus();
                }
                else if(passwort.isEmpty()){
                    inputPasswort.setError("Bitte geben Sie ein Passwort ein");
                    inputPasswort.requestFocus();
                }
                else if(!email.isEmpty()&&!passwort.isEmpty()){
                    for(int i=0;i<user.length();i++){
                       String userAddributs[]=  user.split("#");
                       for(int j=0;j<userAddributs.length;j++){
                           Arrays.toString(userAddributs);
                           if(email.equals(userAddributs[2])&&passwort.equals(userAddributs[3])){
                               Intent intent= new Intent(MainActivity.this,
                                       FreezerManagment.class);
                               startActivity(intent);
                           }else if(!email.equals(userAddributs[2])){
                               inputEmail.setError("Emailadresse stimmt nicht überein.");
                           }else if(!passwort.equals(userAddributs[3])){
                               inputPasswort.setError("Passwort stimmt nicht überein.");
                           }
                           else{
                               inputEmail.setError("Emailadresse stimmt nicht überein.");
                               inputPasswort.setError("Passwort stimmt nicht überein.");
                           }
                       }

                    }
                }
            }
        });

    }
     //register button
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this,Register.class);
        startActivity(intent);

    }
}
```


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.SharedPreferencesCompat;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Register extends AppCompatActivity implements View.OnClickListener {

    SharedPreferences sharedPreferences;

    Button regristryFinish;



    int inputID;
    User user =new User();
    String userData;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        regristryFinish=(Button)findViewById(R.id.btnRegistry);
        regristryFinish.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {


        //decliation
        String input;
        String inputE;
        String inputP;
        String inputControlP;
        Counter counter = null;



        //source
        EditText inputName= (EditText)findViewById(R.id.bntInputName);
        EditText inputEmail=(EditText)findViewById(R.id.bntInputEmail);
        EditText setPasswort=(EditText)findViewById(R.id.bntsetPasswort);
        EditText setControlPasswort=(EditText)findViewById(R.id.bntControlPasswort);
        TextView inputAnswer=(TextView) findViewById(R.id.btnAnswer);




        //set to User
        input= (inputName.getText().toString());
        inputE= (inputEmail.getText().toString());
        inputP= (setPasswort.getText().toString());
        inputControlP=(setControlPasswort.getText().toString());


       user.setUserName(input);
       user.setEmail(inputE);
        if(input.equals(inputControlP)){
            user.setPasswort(inputP);
        }
        else {
            inputAnswer.setText("Passwörter stimmen nicht überein");
        }


        inputID=counter.getId();
        user.setUserID(inputID);
        userData= user.toString();
        sharedPreferences= this.getSharedPreferences("User.txt",0);
        SharedPreferences.Editor editor=sharedPreferences.edit();

        inputAnswer.setText("Regristration erfolgreich!");
        editor.putString("inputID",userData);
        editor.commit();

        Intent intent= new Intent(this,MainActivity.class);
        startActivity(intent);

    }
}
```

Das ist jetzt die Fehlermeldung:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: de.miguel.frozzenlist.frozzenbetaa, PID: 18749
    java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
        at de.miguel.frozzenlist.frozzenbetaa.MainActivity$1.onClick(MainActivity.java:59)
        at android.view.View.performClick(View.java:7438)
        at android.view.View.performClickInternal(View.java:7415)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28286)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7523)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)


----------



## mihe7 (22. Jun 2020)

Panda9296 hat gesagt.:


> So wie ich das verstehe muss die zeile also natürlich in "inputID"gewechselt werden... soweit so gut.


Nein. Die Preferences sind eine Sammlung von Key-Value-Paaren und die werden in einer Datei gespeichert. Natürlich musst Du dann die gleiche Datei verwenden. Ebenso musst Du den gleichen Key zum Schreiben und Lesen verwenden.

Du verwendest nach wie vor unterschiedliche Dateien 


Panda9296 hat gesagt.:


> sharedPreferences= MainActivity.this.getSharedPreferences ("userID",Context.MODE_PRIVATE);





Panda9296 hat gesagt.:


> sharedPreferences= this.getSharedPreferences("User.txt",0);


und user wird überhaupt nicht ausgelesen.


----------



## Panda9296 (22. Jun 2020)

Lach mich nicht aus  
ich blicke nicht durch ich gehe seit über eine Stunde den kompletten Verlauf durch ich versuche deine Anweisungen umzusetzen, aber irgendwie....
darf ich dich vielleicht in Discord zu einer Konferenz einladen . Ich muss das verstehen wirklich ich sitze seit 3 Tagen daran. Bitte bitte


----------



## mihe7 (22. Jun 2020)

Ich habe kein Discord. Stell Dir die SharedPreferences einfach als Datei vor. Bei getSharedPreferences gibst Du den Namen der zu verwendenden Datei an. Wenn Du also in der Register-Activity in eine Datei "user.txt" etwas hineinschreibst, dann musst Du in der MainActivity natürlich aus der Datei "user.txt" wieder lesen (und nicht aus Datei Y). D. h. in beiden Fällen wird getSharedPreferences "user.txt" als Parameter erhalten müssen.

Mit

```
editor.putString("inputID",userData);
```
schreibst Du in die Datei, dass unter dem Key "inputID" der Wert von userData abgelegt werden soll.

Dem entsprechend musst Du userData in der MainActivity wieder mit

```
String userData = sharedPreferences.getString("inputID");
```
aus der Datei laden.

Was sollen eigentlich die beiden Schleifen in Deinem Listener?


----------



## Panda9296 (22. Jun 2020)

ok ich probiere das jetzt nochmal.
Ich gehe das jetzt Zeichen für Zeichen durch ich will das hinbekommen  .
Die sind warscheinlich dafür verantwortlich, dass das programm bei click abstürtzt... Ich habe ja den String zerlegt. Hab ihn in ein Array gespeichert und den String des array wollte ich index für index auslesen und ihn splitten und dannach wollte ich von userAddributs den index 2 und 3 prüfen, da ich weiß dass das die email und das passwort ist und die wollte ich auch überprüfen.

ich dachte das ist dann wie eine Hashmap du hast dann den key also den userID und fragst die User ab und du prüfst pro user also pro Account das passwort und die email bzw soll er ja den key berücksichtigen... Ich dachte ich vergleiche dann die Eingabe mit eingespeicherten Passwort und wenn das true ist hat er zugang zu seinem Account der Freezer Manager ist so eine konfigurationsstelle da soll dann entweder die bestehende Gefriertruhe ausgewählt werden oder eine neue mit neuem Setup erstellt werden können. Ich brauch die Daten auch, um natürlich einer gefriertruhe mehrere User zuzuordnen und ich kenne zwar sqllite aber ich möchte die app unabhängig von einer datenbank entwickeln. Ich mache eine Umschulung zum Fachinformatiker für Anwendungsentwicklung. Ich hab ende nächsten Jahres Prüfung und wir arbeiten gerade die Grundlagen von Java durch. Ich habe mir aber vorher das Wissen vom Buch "Hallo Schrödinger" beigebracht. Nur da sind es halt nur Übungen. Wenn man dann so ein ganzes Projekt hat, ist es für mich zumindest, was vollkommen anderes.


----------



## Panda9296 (22. Jun 2020)

ich habe auch ein Lastenheft erstellt ^^ Fürs Pflichtenheft war ich zu faul und habe skizzierte Klassendiagramme gemacht. Vielleicht war das ein Fehler, aber ich dachte mir, wenn ich eh schauen muss wie es in Android geht, bringt der Plan auch nix. So wollte ich Stück für Stück einbinden.

```
package de.miguel.frozzenlist.frozzenbetaa;

public class Product {


    private String name;
    private int ProductID;
    private String typ;
    private int frozzenDate;


    public void setName(String name) {
        this.name = name;
    }

    public int getProductID() {
        return ProductID;
    }

    public void setProductID(int productID) {
        ProductID = productID;
    }

    public String getTyp() {
        return typ;
    }

    public void setTyp(String typ) {
        this.typ = typ;
    }


    @Override
    public String toString() {
        return "Product [name=" + name + ", ProductID=" + ProductID + ", typ=" + typ + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ProductID;
        result = prime * result + frozzenDate;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((typ == null) ? 0 : typ.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Product other = (Product) obj;
        if (ProductID != other.ProductID)
            return false;
        if (frozzenDate != other.frozzenDate)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (typ != other.typ)
            return false;
        return true;
    }
}
```


```
package de.miguel.frozzenlist.frozzenbetaa;

import java.util.ArrayList;

public class Tray {

    private int trayID;
    private ArrayList<Product> productList= new ArrayList<Product>();

    public Tray(int trayID, int userID,ArrayList<Product>productList) {
        this.trayID = trayID;
        this.productList=productList;
    }
    public void showTray() {
        toStringForListInformation();
    }
    public void addProduct(ArrayList<Product>productList, Product product){

        productList.add(product);
    }
    public void removeProduct(int input,ArrayList<Product>productlist) {
        toStringForListInformation();
        toStringQuestionWhichIndexRemove();
        productlist.remove(input);
    }
    public int getTrayID() {
        return trayID;
    }
    public void setTrayID(int trayID) {
        this.trayID = trayID;
    }
    public ArrayList<Product> getProductList() {
        return productList;
    }
    public void addProduct(String name,String typ,int productID) {
        Product product =new Product();
        product.setName(name);
        product.setTyp(typ);
        product.setProductID(productID);
        productList.add(product);
    }
    public void removeProduct(int input) {
        for(int i=0;i<productList.size();i++) {
            while(input==i) {
                productList.remove(i);
            }toStringMessageOutOfBons();
        }
    }
    public void changeProduct(int input,String name,String typ,int productID) {
        for(int i=0;i<productList.size();i++) {
            while(input==i) {
                productList.get(i);
                Product product =new Product();
                product.setName(name);
                product.setTyp(typ);
                product.setProductID(productID);
                productList.add(i, product);


            }toStringMessageOutOfBons();
        }
    }

    @Override
    public String toString() {
        return "Tray [trayID=" + trayID + ", productList=" + productList + "]";
    }
    @SuppressWarnings("unused")
    public String toStringForListInformation() {

        for(int i=0;i<productList.size();i++) {

            return "Listung des Faches: "+trayID+"\n "+productList.get(i);
        }
        return "Keine Liste vorhanden";
    }
    public static String toStringQuestionWhichIndexRemove() {
        return "Welchen Index wollen Sie löschen?";
    }
    public static String toStringMessageOutOfBons() {
        return "Falsche Eingabe. Deine Eingabe ist außerhalb der Indexreichweite!\nVersuche es nochmal";
    }
}
```


```
package de.miguel.frozzenlist.frozzenbetaa;

import java.util.ArrayList;

public class Freezer {

    ArrayList<Tray>tray= new ArrayList<Tray>();
}
```


----------



## Panda9296 (22. Jun 2020)

mihe7 hat gesagt.:


> Ich habe kein Discord. Stell Dir die SharedPreferences einfach als Datei vor. Bei getSharedPreferences gibst Du den Namen der zu verwendenden Datei an. Wenn Du also in der Register-Activity in eine Datei "user.txt" etwas hineinschreibst, dann musst Du in der MainActivity natürlich aus der Datei "user.txt" wieder lesen (und nicht aus Datei Y). D. h. in beiden Fällen wird getSharedPreferences "user.txt" als Parameter erhalten müssen.
> 
> Mit
> 
> ...


So ich bin alles durchgegangen und eigentlich sollte es funktionieren. Das Speichern geht zumindest. Nur wenn ich da jetzt überprüfen möchte, ob das selbe drinnen steht im Array,dann kommt ein false. Theoretisch müsste das Laden aber funktionieren. ÄHM und das Array hab ich auch überarbeitet  und ich habe die Klasse User auch nochmal was hinzugefügt aber erst die Wesentlichen Sachen zu dem Thread:


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.util.Arrays;

import static android.app.PendingIntent.getActivity;

public class MainActivity extends Activity implements View.OnClickListener {

    Button btnRegister;
    Button btnSignIn;
    SharedPreferences sharedPreferences;
    String userData;

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

        btnRegister= (Button)findViewById(R.id.bntRegister);
        btnRegister.setOnClickListener(this);
        btnSignIn= (Button)findViewById(R.id.bntSignIn);

        // sign in condition
        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                EditText inputEmail= (EditText)findViewById(R.id.bntViewEmail);
                EditText inputPasswort= (EditText)findViewById(R.id.btnViewPasswort);
                // Shared Preferencs

                sharedPreferences= MainActivity.this.getSharedPreferences
                                               ("userID",0);
                SharedPreferences.Editor editor= sharedPreferences.edit();
                userData=sharedPreferences.getString("inputID",userData);



                String email = inputEmail.getText().toString();
                String passwort= inputPasswort.getText().toString();

                if(email.isEmpty()){
                    inputEmail.setError("Bitte Email eingeben");
                    inputEmail.requestFocus();
                }
                else if(passwort.isEmpty()){
                    inputPasswort.setError("Bitte geben Sie ein Passwort ein");
                    inputPasswort.requestFocus();
                }
                else if(!email.isEmpty()&&!passwort.isEmpty()) {
                    String userAccount[]=userData.split("#");

                    if (userAccount[2].contains(email)&&userAccount[3].contains(passwort)){
                       Intent intent = new Intent(MainActivity.this,
                               FreezerManagment.class);
                       startActivity(intent);
                   }
                    else{
                        System.out.println("fail");
                    }

                }
            }
        });

    }
     //register button
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this,Register.class);
        startActivity(intent);

    }
}
```


```
package de.miguel.frozzenlist.frozzenbetaa;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.SharedPreferencesCompat;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Register extends AppCompatActivity implements View.OnClickListener {

    SharedPreferences sharedPreferences;

    Button regristryFinish;



    int inputID;
    User user =new User();
    String userData;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        regristryFinish=(Button)findViewById(R.id.btnRegistry);
        regristryFinish.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {


        //decliation
        String input;
        String inputE;
        String inputP;
        String inputControlP;
        Counter counter= new Counter();



        //source
        EditText inputName= (EditText)findViewById(R.id.bntInputName);
        EditText inputEmail=(EditText)findViewById(R.id.bntInputEmail);
        EditText setPasswort=(EditText)findViewById(R.id.bntsetPasswort);
        EditText setControlPasswort=(EditText)findViewById(R.id.bntControlPasswort);
        TextView inputAnswer=(TextView) findViewById(R.id.btnAnswer);




        //set to User
        input= (inputName.getText().toString());
        inputE= (inputEmail.getText().toString());
        inputP= (setPasswort.getText().toString());
        inputControlP=(setControlPasswort.getText().toString());


       this.user.setUserName(input);
       this.user.setEmail(inputE);
        if(input.equals(inputControlP)){
            user.setPasswort(inputP);
        }
        else {
            inputAnswer.setText("Passwörter stimmen nicht überein");
        }


        inputID=counter.getId();
        this.user.setUserID(inputID);
        userData= this.user.toString();
        sharedPreferences= this.getSharedPreferences("userID",0);
        SharedPreferences.Editor editor=sharedPreferences.edit();
            editor.putString("inputID",userData);
            editor.commit();
            if (editor.commit()){
            inputAnswer.setText("Regristration erfolgreich!");

            Intent intent= new Intent(this,MainActivity.class);
            startActivity(intent);
        }
            else{
                inputAnswer.setText("Regristration nicht erfolgreich!");
            }



    }
}
```
Also es wurde aufjedenfall gespeichert und ich rufe es diesmal genauso auf wie du es geschrieben hast...hoffe ich sonst klappe ich den pc zu und schmeiß ihn ins Wasser


----------



## mihe7 (22. Jun 2020)

So sieht der Code in der MainActivity auf jeden Fall schon mal wesentlich besser aus (den Editor brauchst Du dort aber nicht).

Schauen wir uns das mal an:


```
String userAccount[]=userData.split("#");

                    if (userAccount[2].contains(email)&&userAccount[3].contains(passwort)){
                       Intent intent = new Intent(MainActivity.this,
                               FreezerManagment.class);
                       startActivity(intent);
                   }
                    else{
                        System.out.println("fail");
                    }
```

User#toString, hast Du geschrieben, sieht so aus:

```
public String toString() {
        return "#" + userID + "#" + userName + "#" + passwort + "#" + email
                + "#";
    }
```

In dem Fall wäre der Benutzername bei Index 2 und E-Mail bei Index 4. Du vergleichst aber oben email mit Index 2, also dem Benutzernamen. Entweder musst Du oben den Index auf 4 ändern, oder mit email wird in der MainActivity der Benutzername abgefragt. Das wäre, was mir gerade auffallen würde.


----------



## Panda9296 (23. Jun 2020)

mihe7 hat gesagt.:


> So sieht der Code in der MainActivity auf jeden Fall schon mal wesentlich besser aus (den Editor brauchst Du dort aber nicht).
> 
> Schauen wir uns das mal an:
> 
> ...


nein hatte ich leider schon überprüft ich habe den Code so geändert:

```
public String toString() {
        return "#" + userID + "#" + userName + "#" + email + "#" + passwort
                + "#";
}
```
somit ist der Code ja bei 2 und 3 weil es ja bei 0 anfängt zu zählen


----------



## Panda9296 (23. Jun 2020)

mihe7 hat gesagt.:


> So sieht der Code in der MainActivity auf jeden Fall schon mal wesentlich besser aus (den Editor brauchst Du dort aber nicht).
> 
> Schauen wir uns das mal an:
> 
> ...





mihe7 hat gesagt.:


> So sieht der Code in der MainActivity auf jeden Fall schon mal wesentlich besser aus (den Editor brauchst Du dort aber nicht).
> 
> Schauen wir uns das mal an:
> 
> ...


neuer Tag neues Glück ich denke ich habe den Fehler gefunden. Es liegt an sharedPreferences ich habs einigermaßen endlich verstanden. sharedPreferences.getString soll meinen Key holen und der key hat mein user data ich hatte das vorher allerdings so gelöst:

```
userData=sharedPreferences.getString("inputID",userData );
```
 macht natürlich keinen Sinn... da kann nix gespeichert sein ich habe das gelöscht. Du hattest ja gemeint, dass der Code so geholt wird


```
userData=sharedPreferences.getString("inputID");
```
und warum auch immer zeigt er einen fehler mit dem Key an also "inputID" ich hatte es aber überprüft und der key ist dieser inputID key^^ er erwartet also einen zweiten parameter weil die fehlermeldung dann weg ist. Was erwartet er den? Einen String? Welchen?


----------



## thecain (23. Jun 2020)

Save key-value data  |  Android Developers
					






					developer.android.com


----------



## Panda9296 (23. Jun 2020)

thecain hat gesagt.:


> Save key-value data  |  Android Developers
> 
> 
> 
> ...


Danke für deine Antwort und deine Einbringung in das Themenfeld. Allerdings wurde es schonmal gepostet im Verlauf und so wie ich das sehe, habe ich die Anweisungen komplett befolgt. Ich weiß nicht worauf du aus bist^^. Wenn du so nett wärst, mir nochmal erklärst was genau das Problem ist, wäre ich sehr dankbar, da ich mir das jetzt seit heute um 11 anschaue und nicht genau weiß, warum du den Link gepostet hast^^. Wahrscheinlich wegen dem Laden? Weil das speichern funktioniert laut meiner kleinen Prüfung . Ich bin mir auch sicher, dass ich jede andere Weise egal wie du sie dir ausmalst durchprobiert habe, da ich seit dem Wochenende schon daran sitze.


----------



## thecain (23. Jun 2020)

Da steht zum Beispiel für was der zweite Parameter ist.
und es steht auch, wenn du nur ein Preferences brauchst, kannst du es so aufrufen


> Alternatively, if you need just one shared preference file for your activity, you can use the getPreferences() method:



Dann steht in der Doku auch, dass das zweite Attribut von getString null sein darf. (aber nicht weggelassen)

Dann steht da auch, dass es ein "getAll" gibt, womit du dir mal alles anzeigen lassen könntest, um zu schauen ob da überhaupt was geschrieben wird.


----------

