Daten bzw Objekte auf das Handy lokal speichern

Diskutiere Daten bzw Objekte auf das Handy lokal speichern im Mobile Geräte Bereich.
mihe7

mihe7

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
Java:
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
Java:
String userData = sharedPreferences.getString("inputID");
aus der Datei laden.

Was sollen eigentlich die beiden Schleifen in Deinem Listener?
 
P

Panda9296

ok ich probiere das jetzt nochmal.
Ich gehe das jetzt Zeichen für Zeichen durch ich will das hinbekommen :D .
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.
 
P

Panda9296

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.
Code:
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;
    }
}
Code:
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";
    }
}
Code:
package de.miguel.frozzenlist.frozzenbetaa;

import java.util.ArrayList;

public class Freezer {

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

Panda9296

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
Java:
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
Java:
String userData = sharedPreferences.getString("inputID");
aus der Datei laden.

Was sollen eigentlich die beiden Schleifen in Deinem Listener?
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 :D und ich habe die Klasse User auch nochmal was hinzugefügt aber erst die Wesentlichen Sachen zu dem Thread:

Code:
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);

    }
}
Code:
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 :D
 
mihe7

mihe7

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:

Java:
                    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:
Java:
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.
 
P

Panda9296

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:

Java:
                    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:
Java:
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.
nein hatte ich leider schon überprüft ich habe den Code so geändert:
Code:
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
 
P

Panda9296

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:

Java:
                    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:
Java:
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.
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:

Java:
                    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:
Java:
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.
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:
Code:
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

Code:
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?
 
P

Panda9296

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 :D. 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.
 
T

thecain

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.
 
Thema: 

Daten bzw Objekte auf das Handy lokal speichern

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben