Byte-Array (SharedPreferences) ändert eingetragene int?

  • 0 Antworten
  • Letztes Antwortdatum
J

Juleru

Fortgeschrittenes Mitglied
5
Hallo zusammen!

Ich bin gerade dabei, den Highscore für ein kleines Spiel mittels SharedPreferences zu implementieren und Namen übergeben, eingeben, ausgeben, etc. funktioniert schon ganz gut, allerdings habe ich ein Problem:
Zwischen "neuen Score in SP eintragen" und "Alle Einträge aus SP holen" ändert sich der Score irgendwo immer auf den Wert 495 (egal, ob ursprünglich 350 oder auch 500) und ich habe keine Ahnung, wieso.

Zum Grundgerüst:
Auf dem "Spiel abgeschlossen"-Bildschirm gibt es einen "Highscore"-Button, der zum "Bitte Namen eingeben"-Bildschirm führt. In dieser "EnterHS"-Activity wird auch gleich ausgerechnet, wie der Score ist (abhängig von der Anzahl der übrigen Leben). Wenn man auf "Ok" drückt, geht es weiter zur "Highscore"-Activity (Liste mit allen bereits erreichten Scores wird angezeigt).
In dieser Activity gibt es, zusätzlich zu onClick, etc. noch die beiden Methoden writeHS und readHS. Es wird halt nur dann in die SharedPreferences geschrieben (writeHS), wenn man das Spiel beendet hat (nicht auch, wenn man vom Hauptmenü kommt), aber jedes Mal neu gelesen, wenn man auf die Seite kommt (nona).
In der "onClick" holt er sich den eingegebenen Namen und den Score aus den anderen Activities (mit intent bzw. static-Variable), dazu noch die writeHS und readHS-Aufrufe/Abfragen und dort wird im Endeffekt auch die ganze Liste (Array vom Typen StringInt (=String und int in einer Klasse)) in Tabellen-Form ausgegeben.

Ich habe schon versucht, direkt 350 Punkte einzutragen (also writeHS(name, 350)) und er hat 350 ausgegeben. Als ich es mit 500 versucht habe, wurden aber wieder nur 495 in die Tabelle eingetragen und die Punkte erst in den anderen Activities zu holen und dann einzutragen, bringt sowieso immer nur 495 Punkte.
Ich habe an verschiedensten Stellen den Wert der "score"-int-Variable ausgegeben und scheinbar passiert die Veränderung der Zahl irgendwo zwischen schreiben und lesen, allerdings ändere ich selbst nichts daran, sondern hole sie mir nur aus den anderen Activities, dann, nach dem Lesen, aus dem Array und trage sie, ohne Umwege, gleich in der Tabelle ein.

Hier der Code:

Code:
public void writeHS(String nam, int punkte) throws IOException {
    SharedPreferences pref = getSharedPreferences(PREF, 0);
    SharedPreferences.Editor editor = pref.edit();
    String name = nam;
    int score = punkte ;
    ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();
    DataOutputStream dataOutStream = new DataOutputStream(byteOutStream);
    dataOutStream.writeUTF(name);
    dataOutStream.writeInt(score);
    int cmax = -1 ;
        
    for(Entry<String, ?> entry : pref.getAll().entrySet()){
        String s = entry.getKey();
        int n = Integer.parseInt(s.substring(PREFIX.length())) ;
            
        if(n>cmax) {
            cmax = n ;
        }
    }
    
    cou = cmax + 1 ;        
    editor.putString(PREFIX + cou, byteOutStream.toString());
    cou = cou++ ;
    editor.commit();
}


public StringInt[] readHS() throws IOException {
    SharedPreferences pref = getSharedPreferences(PREF, 0);    
    String name = "" ;
    int score = 0 ;
    StringInt[] feld = new StringInt[pref.getAll().entrySet().size()] ;
    int i = 0 ;
    
    for(Entry<String, ?> entry : pref.getAll().entrySet()){
        if (entry.getKey().contains(PREFIX)) {
            ByteArrayInputStream byteInStream = new ByteArrayInputStream
            (((String) entry.getValue()).getBytes());
            DataInputStream dataInStream = new DataInputStream(byteInStream);
            
            name = dataInStream.readUTF();
            score = dataInStream.readInt();
            feld[i] = new StringInt(name, score) ;
            i++;
        }
    }
    return feld ;
}
Habt ihr eine Idee, was da das Problem sein könnte?

Edit: Habe es gerade mal mit weniger Punkten (mit static Variable bzw. intent übergeben/geholt) versucht, nämlich 230. In der Tabelle stehen allerdings 239 drin! Was ist da los? Kommen Byte-Arrays leicht doch nicht mit Integern zurecht oder hängt das irgendwie mit der Umwandlung zusammen?
 
Zuletzt bearbeitet:
Zurück
Oben Unten