SQLite Datenbank mit App ausliefern - später App Update

D

daifel

Neues Mitglied
Threadstarter
Hi,

ich will eine App programmieren und habe eine SQLite Datenbank die über den assets Ordner mit ausgeliefert werden soll.
Für mich stellt sich jetzt die Frage, wie löse ich das folgende Problem am Besten:

a) der Benutzer ändert / ergänzt die Datenbank mithilfe der App (im Beispiel: Benutzer macht Bewertungen) UND
b) die Datenbank wird später bei einem App Update um Einträge ergänzt (im Beispiel: neue Bücher)

Ein kurzes Beispiel, dass ich mir gerade schnell ausgedacht habe ;)
Es gibt eine Buchdatenbank mit den Tabellen Bücher und Bewertungen

Bücher
Code:
_id | Buchtitel | Bild      | ISBN   | ...
-----------------------------------------
1   | Buch1     | bild1.png | 123... | ...
2   | Buch2     | bild2.png | 345... | ...
3   | Buch3     | bild3.png | 678... | ...
Bewertungen
Code:
_id | BuchID | Gelesen  | Bewertung
----------------------------------
1   | 1      | ja (1)   | 5
2   | 2      | nein (0) | null
3   | 3      | ja (1)   | 1
Wenn die App zum ersten Mal ausgeliefert wird sind z.B. 10 Bücher in der Datenbank und es gibt keine Bewertungen. Bei einem App Update sollen z.B. 15 weitere Bücher hinzugefügt werden, aber die Bewertungen, die die Benutzer für irgendwelche Bücher gemacht haben, sollen beibehalten werden.

Hat jemand eine Idee wie ich das am Besten umsetzen kann?




Mir fallen im Moment nur zwei Möglichkeiten ein:
  1. Bei einem Update wird die alte Büchertabelle gelöscht und durch die neue ersetzt
  2. 2 Datenbanken: eine Datenbank für statische Daten (Bücher) und eine Datenbank für dynamische Daten (Bewertungen). Bei einem Update wird einfach die Datenbank mit den statischen Daten ersetzt
Ich hoffe von euch hat noch jemand einen guten Vorschlag :D


Viele Grüße
daifel
 
DGIR

DGIR

Neues Mitglied
Hi

warum lieferst Du die Datenbank als db-file aus?

Ich persönlich mache das bei meinen Datenbankanwendungen anders und lasse beim ersten Start der App die Struktur selbst erstellen und spiele die Basisdaten ein. bei nem update wird ide versionsnummer hochgezählt und die struktur wenn notwendig angepasst, die daten erweitert etc ...So muss ich mich nur um SQL-Befehle kümmern, der Rest wird durch das System selbst erledigt ;)

Siehe:
SQLiteOpenHelper | Android Developers

Gruß DGIR
 
D

daifel

Neues Mitglied
Threadstarter
Hi,

stimmt so könnte ich es auch noch machen, da ich am Anfang nur ca. 200 Einträge habe. Kennst du ein Programm, dass eine SQLite Datenbank in SQL Befehle umwandelt, da ich die Datenbank schon habe.

Habe noch eine Frage zu der SQLiteOpenHelper. Die onUpgrade Methode wird ja einmal aufgerufen, wenn die Datenbankversion erhöht wurde.

Wie stellst du sicher, dass wenn jemand eine Datenbankversion überspringt (also die App nicht jede Version aktualisiert) trotzdem alle Datenbankaktualisierungen bekommt. Etwa so:
Code:
// erste Version ist 1
public void onUpgrade(db, int oldVersion, int newVersion) {
   if(oldVersion < 2 && newVersion >= 2) {
      // erstes update
   }
   if(oldVersion < 3 && newVersion >= 3) {
      // zweites update
   }
   if(oldVersion < 4 && newVersion >= 4) {
      // drittes update
   }
}
Viele Grüße
daifel
 
DGIR

DGIR

Neues Mitglied
daifel schrieb:
Habe noch eine Frage zu der SQLiteOpenHelper. Die onUpgrade Methode wird ja einmal aufgerufen, wenn die Datenbankversion erhöht wurde.

Wie stellst du sicher, dass wenn jemand eine Datenbankversion überspringt (also die App nicht jede Version aktualisiert) trotzdem alle Datenbankaktualisierungen bekommt.
naja, fast - eher so:
Code:
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < newVersion) {
            String sqlCreate = null;
            for (int currentVersion = oldVersion; currentVersion < newVersion; currentVersion++) {
                switch (currentVersion) {
                case 2:
                    // Templates neu in Version 3 dazugekommen
                    sqlCreate = "CREATE TABLE " ,,,
                    db.execSQL(sqlCreate);
                    break;
                case 3:

                    // DB Updaten
                    String sqlAddColumn = "ALTER TABLE " ...
                    db.execSQL(sqlAddColumn);
                    
                    break;
                case 4:
                    // sollte die tabelle schon existieren - drop
                    db.execSQL("DROP TABLE IF EXISTS " ...;
                    break;
                }
            }
        }
    }
 
Oben Unten