Daten speichern und Zugriff

S

schmju5n

Neues Mitglied
0
Hallo,

ich habe in meiner App ziemlich viele Objekte welche ich immer wieder benötige... Wenn ich diese immer mit putExtras an die nächste Activity übergebe dauert das einfach zu lange...

Nun wollte ich fragen ob es eine Möglichkeit gibt die Objekte irgendwo zu speichern und dann nur zum Beispiel ne ID zum jeweiligen Objekt an die nächste Activity zu übergeben?

Wenn ich die Daten in ein txt.File streame ist es auch blöd da die ja dann offen liegen oder?

Wäre für einen Tip wirklich dankbar...

Viele Grüße
 
Du kannst eine application class definieren.. in dieser kannst du variablen beim start initialisieren und in jeder Methode abrufen:


public class MYAPP extends Application {
String xy = new String();
}

in den Klassen:
MYAPP app = ((MYAPP)getApplicationContext());

und dann einfach app.xy zum aufrufen des Strings.

MfG ;)

Edit: die application class muss in der manifest datei angegeben werden!
 
  • Danke
Reaktionen: schmju5n
Hört sich sehr interessant an!

Ich überlege gerade ob es nicht mit Serialisieren der Objekte und abspeichern einfacher wäre... Da ja so dann auch sämmtliche Methoden gleich wieder verfügbar wären...
 
Alternative wäre diese im JSON-Format in einen privaten Datei zu speichern.
Ich kann meine Library empfehlen:

https://github.com/ko5tik/jsonserializer/
( nutze ich um die Highscores zu managen , demnächst kommt ein neues release
die mit dem Pull-Parser funktioniert - branch gson)
 
  • Danke
Reaktionen: schmju5n
Habe das Ganze nun erstmal so gelöst, dass ich die objekte auf der SD Karte speichere mit

ObjectOutputStream oos;
oos = new ObjectOutputStream(new FileOutputStream(
("/sdcard/daten") ));

Nun hab ich mal gelesen, dass SD Karten ja verschleißen und jeder Schreibzugriff diesen Prozess bescheunigen...

Weis jemand wie ich Daten auf dem internen Telefonspeicher legen kann?? Macht das dann mehr Sinn?

Oder ist die Sache mit dem JSON-Format doch einfacher und besser? Habe leider noch nie damit gearbeitet... Bräuchte da vielleicht zum Einstieg erstmal bisschen Übung und Beispielcode...

Schöne Grüße
 
schmju5n schrieb:
Nun hab ich mal gelesen, dass SD Karten ja verschleißen und jeder Schreibzugriff diesen Prozess bescheunigen...

Weis jemand wie ich Daten auf dem internen Telefonspeicher legen kann?? Macht das dann mehr Sinn?
Nein, intern ist auch Flashspeicher.
Es stimmt, dass eine Speicherzelle nur eine bestimmte Anzahl an Schreibvorgängen mitmacht, aber dank Techniken wie Wear-leveling kann man das vernachlässigen, man kommt trotzdem auf einige Jahre Lebenszeit (wenn das Ding nicht gerade randvoll ist und deshalb immer wieder in den gleichen Bereich geschrieben werden muss).
 
  • Danke
Reaktionen: schmju5n
Zonnex schrieb:
Du kannst eine application class definieren.. in dieser kannst du variablen beim start initialisieren und in jeder Methode abrufen:


public class MYAPP extends Application {
String xy = new String();
}

in den Klassen:
MYAPP app = ((MYAPP)getApplicationContext());

und dann einfach app.xy zum aufrufen des Strings.

MfG ;)

Edit: die application class muss in der manifest datei angegeben werden!


Kann ich in MYAPP, dann auch auch Objekte speichern??? Wie und wo muss ich die Klasse im Manifest hinzufügen, klappt bei mir noch nicht...
 
schmju5n schrieb:
Habe das Ganze nun erstmal so gelöst, dass ich die objekte auf der SD Karte speichere mit

ObjectOutputStream oos;
oos = new ObjectOutputStream(new FileOutputStream(
("/sdcard/daten") ));

Ich würde von dieser Art der Serialisierung absehen - wenn der Klasse geändert wird, werden die gespeicherte Daten nicht mehr lesbar.
(Problem mit Updates).

Mach lieber XML oder JSON daraus

Nun hab ich mal gelesen, dass SD Karten ja verschleißen und jeder Schreibzugriff diesen Prozess bescheunigen...

So nach etwa 1000000 Schreibvorgängen - also solange lebt kein Telefon ;)

Weis jemand wie ich Daten auf dem internen Telefonspeicher legen kann?? Macht das dann mehr Sinn?

Oder ist die Sache mit dem JSON-Format doch einfacher und besser? Habe leider noch nie damit gearbeitet... Bräuchte da vielleicht zum Einstieg erstmal bisschen Übung und Beispielcode...
Schöne Grüße

Schau mal bei meinen Projekt in die Unit-Testss ein - dort sind eigentlich Beispiele drin

Laden ( storage ist eine Liste):
Code:
            Reader reader = new BufferedReader(new InputStreamReader(context.openFileInput(fileName)));
            JsonReader source = new JsonReader(reader);
            source.setLenient(true);


            // clear storage
            storage.clear();
            // and load from reader
            storage.addAll(JSONUnmarshaller.unmarshallArray(source, clazz));

            reader.close();
Speichern einer LIste:

Code:
        OutputStream fos = context.openFileOutput(fileName, 0);
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);
        JsonWriter writer = new JsonWriter(outputStreamWriter);
        JSONMarshaller.marshallArray(writer, array.toArray());
        writer.flush();
        writer.close();       
        fos.close();
 
  • Danke
Reaktionen: schmju5n
ko5tik schrieb:
Ich würde von dieser Art der Serialisierung absehen - wenn der Klasse geändert wird, werden die gespeicherte Daten nicht mehr lesbar.
(Problem mit Updates).

Mach lieber XML oder JSON daraus

Also, es klappt bereits mit der Art, ich muss halt wenn ich meine Objekte ändere diese immer wieder überspeichern... Dann kann ich die wenn ich sie wieder benötige erneut laden und so weiter... Leider ist diese Vorgehensweise sehr zeitaufwendig....

ko5tik schrieb:
Schau mal bei meinen Projekt in die Unit-Testss ein - dort sind eigentlich Beispiele drin

Laden ( storage ist eine Liste):
Code:
Reader reader = new BufferedReader(new InputStreamReader(context.openFileInput(fileName)));
JsonReader source = new JsonReader(reader);
source.setLenient(true);


// clear storage
storage.clear();
// and load from reader
storage.addAll(JSONUnmarshaller.unmarshallArray(source, clazz));

reader.close();

Speichern einer LIste:

Code:
OutputStream fos = context.openFileOutput(fileName, 0);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos);
JsonWriter writer = new JsonWriter(outputStreamWriter);
JSONMarshaller.marshallArray(writer, array.toArray());
writer.flush();
writer.close();
fos.close();

wie kann ich in dein Projekt einsehen? Und wie schaut es mit der Geschwindikeit bei JSON aus??

Gibt es ne Möglichkeit, die Objekte in einer Klasse "global" zu definieren, so dass Unterklassen darauf zu greifen können.

Ich bekomme leider immer nen Nullpointer, wenn ich in der Unterklasse auf ein Objekt der Oberklasse zugreifen will... Kann es sein, dass es der GC wegräumt? Oder muss ich die Objekte speziell deklarieren (final??) ??
 
Indem du vorherigen Thread aufmerksam durchliest, und diesen Link findest:

https://github.com/ko5tik/jsonserializer/

Wenn du einen NullPointer hast, dan poste mal den Stacktrace & Deine Objekte
( angestellte Hellseher sind im Urlaub ;) )

Da dies ein Open-Source Projekt ist, kanns du deine Vorschäge machen, Repository
klonen, patches pushen usw ;)
 
ko5tik schrieb:
Ich würde von dieser Art der Serialisierung absehen - wenn der Klasse geändert wird, werden die gespeicherte Daten nicht mehr lesbar.

Tuts dafür nicht die serialVersionUID? Ich habe damit jedenfalls keine Probleme, wenn sich kleinere Dinge an der Klasse ändern.
 
Der kommt aus dem Google GSON ( es gibt da einen halboffizuellen Download, nut mit den Streaming-Klassen - nur 14KB schwer
( notwendige Abhängngkeiten sind in dem Build-Deskriptor aufgeführt - sieh pom.xml )
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
118
swa00
swa00
A
Antworten
10
Aufrufe
1.902
swa00
swa00
B
Antworten
6
Aufrufe
1.049
jogimuc
J
Zurück
Oben Unten