Xml File speichern/auslesen/ändern

  • Antworten:6
Barbaric-Chicken
  • Forum-Beiträge: 23

04.12.2012, 14:49:15 via Website

Hallo,

folgendes habe ich vor:

In einer XML File sollen int werte gespeichert werden. Die müssen sich aber auch überschreiben lassen, da diese einen prozentualen Fortschritt für eine ProgressBar darstellen sollen. Die XML File sollte aber auch nicht vom Besitzer des device eingesehen werden können.

Wie speichere ich die XML File am besten in der app/device ab, wie rufe ich diese wieder auf und wie überschreibe ich die Werte?
Die Standard XML's die man im values Ordner hat gehen dafür ja leider nicht, oder?

Vielen Dank schon mal

MfG

Barbaric-Chicken

Antworten
Stefan S.
  • Forum-Beiträge: 560

05.12.2012, 07:27:37 via Website

Ich vermute auch, dass hier die SharedPreferences besser wären als ein XML File

Antworten
Barbaric-Chicken
  • Forum-Beiträge: 23

07.12.2012, 10:38:13 via Website

Hallo,

sorry das ich erst jetzt antworte.

Also das mit den shared preferneces wird nicht gehen. Meine Frage bezieht sich hier zwar nur auf kleine Progress-Werte von maximal 10 Leveln.
Jedoch soll über selbes Prinzip später auch noch ein XML File ausgelesen werden, was ca. 300 Sprites beinhaltet. Die alle als referenz zu speichern erscheint mir nicht für sinnvoll. Noch dazu müssen später verdammt viele Strings gespeichert werden.

Nun da ich einfach keine Lösung finde und nicht weiter kam dachte ich ich könnte einfach SQLite Datenbanken benutzen?
Habe auch ein Tutorial gemacht, welches mir 3 Klassen erklärte die ich benötige, die scheinen soweit auch zu funktionieren.

Das wäre einmal eine Klasse die von SQLiteOpenHelper ableitet, eine die einen Eintrag darstellt (durch getter und setter) und eine die dann die Einträge erstellt und die Liste zurück liefert usw.
Leider wird in dem Tutorial nirgends gezeigt oder erklärt, wie man nun diese Klassen dazu verwendet um auf Activity A eine Datenbank anzulegen und dann auf Activity C diese auszulesen.

Kann mir da jemand weiter helfen?

Edit:
Hier mal der Code hat ja doch keinen Sinn anders^^:
LevelDataBase:
1public class LevelDatabase extends SQLiteOpenHelper
2{
3
4
5 private static final String DATABASENAME ="levels.db";
6 private static final int DATABASEVERSION = 1;
7
8 private static final String TABLECREATELEVELS =
9 "" + "create table LEVEL" + "ID integer primary autoincrement"
10 + "NAME String" + "PROGRESS int" +"MAXIMUMPROGRESS int";
11
12 public LevelDatabase(Context context)
13 {
14 super(context, DATABASENAME, null, DATABASEVERSION);
15
16 }
17
18 @Override
19 public void onCreate(SQLiteDatabase db)
20 {
21 // TODO Auto-generated method stub
22 db.execSQL(TABLECREATELEVELS);
23 }
24
25 @Override
26 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
27 {
28 // TODO Auto-generated method stub
29 db.execSQL("DROP ITEM IF EXISTS SCAN ITEM");
30 onCreate(db);
31 }
32
33}

Entry:
1public class LevelEntry
2{
3 private long id;
4 private String name;
5 private int progress;
6 private int maximumProgress;
7
8 public int getMaximumProgress()
9 {
10 return maximumProgress;
11 }
12 public void setMaximumProgress(int maximumProgress)
13 {
14 this.maximumProgress = maximumProgress;
15 }
16 public long getId()
17 {
18 return id;
19 }
20 public void setId(long id)
21 {
22 this.id = id;
23 }
24 public String getName()
25 {
26 return name;
27 }
28 public void setName(String name)
29 {
30 this.name = name;
31 }
32 public int getProgress()
33 {
34 return progress;
35 }
36 public void setProgress(int progress)
37 {
38 this.progress = progress;
39 }
40}

DataSource:
1public class LevelsDataSource
2{
3 private SQLiteDatabase database;
4 private LevelDatabase leveldatabase;
5 private String[] allColumns = {"ID","NAME","PROGRESS","MAXIMUMPROGRESS"};
6
7 public LevelsDataSource(Context context)
8 {
9 leveldatabase = new LevelDatabase(context);
10 }
11
12 public void open() throws SQLException
13 {
14 database = leveldatabase.getWritableDatabase();
15 }
16
17 public void close()
18 {
19 leveldatabase.close();
20 }
21
22 public LevelEntry createEntry(String name,int progress,int maximumProgress)
23 {
24 ContentValues values = new ContentValues();
25 values.put("NAME", name);
26 values.put("PROGRESS", progress);
27 values.put("MAXIMUMPROGRESS",maximumProgress);
28
29
30 long insertId = database.insert("LEVEL", null,
31 values);
32
33
34 Cursor cursor = database.query("LEVEL",allColumns, "ID = " + insertId, null, null, null, null);
35 cursor.moveToFirst();
36
37 return cursorToEntry(cursor);
38 }
39
40 public List<LevelEntry> getAllEntries() {
41
42 List<LevelEntry> EntriesList = new ArrayList<LevelEntry>();
43 EntriesList = new ArrayList<LevelEntry>();
44
45 Cursor cursor = database.query("LEVEL", allColumns, null, null, null, null, null);
46 cursor.moveToFirst();
47
48 if(cursor.getCount() == 0) return EntriesList;
49
50
51 while (cursor.isAfterLast() == false)
52 {
53 LevelEntry entry = cursorToEntry(cursor);
54 EntriesList.add(entry);
55 cursor.moveToNext();
56 }
57
58 cursor.close();
59
60 return EntriesList;
61 }
62
63
64 private LevelEntry cursorToEntry(Cursor cursor)
65 {
66 LevelEntry entry = new LevelEntry();
67 entry.setId(cursor.getLong(0));
68 entry.setName(cursor.getString(1));
69 entry.setProgress(cursor.getInt(2));
70 entry.setMaximumProgress(cursor.getInt(3));
71
72 return entry;
73 }
74}

Aufrufen wollte ich den Spaß jetzt so:
1levelsdatasource = new LevelsDataSource(this);
2 levelsdatasource.open();
3 levelsdatasource.createEntry("Test", 14, 25);
4 levelsdatasource.close();

Hier jedoch bei der Zeile levelsdatasource.open() stürzt mir das Programm ab mit der Meldung "Source not found"

Was tun? Oo

MfG

— geändert am 07.12.2012, 11:30:26

Antworten
Christian
  • Forum-Beiträge: 307

08.12.2012, 21:43:45 via Website

Hi Barbaric-Chicken,

mmhh dein TABLECREATELEVELS sieht irgendwie komisch aus.

1String TABLECREATELEVELS = "" + "create table LEVEL" + "ID integer primary autoincrement"+ "NAME String" + "PROGRESS int" +"MAXIMUMPROGRESS int";
2System.out.println(TABLECREATELEVELS);
3
4Ausgabe:
5create table LEVELID integer primary autoincrementNAME StringPROGRESS intMAXIMUMPROGRESS int



ich vermute mal es müsste eher so heißen:
1String test = "CREATE TABLE level ( _id INT AUTOINCREMENT PRIMARY KEY, name TEXT,progress INT, maximumprogress INT);";
2System.out.println(test);
3
4Ausgabe:
5CREATE TABLE level ( _id INT AUTOINCREMENT PRIMARY KEY, name TEXT,progress INT, maximumprogress INT);

mfg Christian

— geändert am 08.12.2012, 21:44:10

Antworten
Barbaric-Chicken
  • Forum-Beiträge: 23

10.12.2012, 16:44:34 via Website

Hallo,

habe ich so geändert. Funktioniert jedoch auch nicht. Habe in vielen Tutorials das hier gefunden und ausprobiert:
1private static final String TABLECREATELEVELS =
2 String.format("CREAT TABLE %s (%s INT PRIMARY KEY, %s TEXT,%s INT,%s INT)", LEVELS,NAME,PROGRESS,MAXIMUMPROGRESS);

Funktioniert jedoch leider auch nicht. Auch mit INTEGER statt INT funktioniert es nicht.
Mit Hilfe des debuggers komme ich bei dem Befehl

1LevelsDataSource levelsdatasource = new LevelsDataSource(this);
in die Klasse LevelDataSource zu diesem Punkt:
1leveldatabase = new LevelDatabase(context);

Dort stürzt es dann mit Source not found ab :(

Ich verzweifele das kann doch alles nicht so schwer sein^^.

MfG

Antworten
Barbaric-Chicken
  • Forum-Beiträge: 23

13.12.2012, 09:59:37 via Website

So,

Danke an alle die geholfen haben. Habe es jetzt mit den sqlite Datenbanken hinbekommen, jedoch anders als hier gezeigt^^
Ich habe einfach mit einem Tool die Datenbanken vorher angelegt und in den assets Ordner kopiert. Ein zugreifen, lesen und schreiben ist auf diesem Weg irgendwie 1000 mal einfacher da man hier keine 3 KLassen zur Verwaltung usw braucht.

Jetzt stehe ich jedoch vor dem Problem das im Simulator alles klappt auf dem Device jedoch nicht. Ich vermute es liegt an den Pfaden der Dateien die ich im Moment so angebe:
1LEVELDATABASEPATH = "/data/data/de.barbaricchicken.app/databases/levelDatabase.db";

Entweder muss ich für auf realen devices das ändern oder mir fehlen irgendwelche Berechtigungen?

Edit: Also ich bekomme beim schreiben der File aus dem assets Ordner in den obigen Ordner eine IOException ausgeworfen :(

Edit²: HIer mal noch der Block der die File aus dem assets Ordner kopieren soll:
1AssetManager manager = this.getAssets();
2
3
4 //Creates levelDatabase.db in LEVELDATABASEPATH
5 File levelDatabase = new File(LEVELDATABASEPATH);
6
7 if(!levelDatabase.exists())
8 {
9 try
10 {
11 //loadingText.setText("Erzeuge Leveldatenbank (einmaliger Vorgang)");
12 InputStream input = manager.open("levelDatabase");
13
14 OutputStream output = new FileOutputStream(LEVELDATABASEPATH); //Löst IOException aus!
15 copyFile(input, output);
16
17 input.close();
18 input = null;
19 output.flush();
20 output.close();
21 output = null;
22 } catch (IOException e)
23 {
24 // TODO Auto-generated catch block
25 e.printStackTrace();
26 }
27}

MfG

— geändert am 13.12.2012, 10:46:30

Antworten