1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

SQLite Datenbank mit App ausliefern - später App Update

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von daifel, 07.01.2011.

  1. daifel, 07.01.2011 #1
    daifel

    daifel Threadstarter Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    07.01.2011
    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
     
  2. DGIR, 07.01.2011 #2
    DGIR

    DGIR Junior Mitglied

    Beiträge:
    37
    Erhaltene Danke:
    4
    Registriert seit:
    24.10.2009
    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
     
    daifel bedankt sich.
  3. daifel, 08.01.2011 #3
    daifel

    daifel Threadstarter Neuer Benutzer

    Beiträge:
    4
    Erhaltene Danke:
    0
    Registriert seit:
    07.01.2011
    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
     
  4. enrem, 08.01.2011 #4
    enrem

    enrem Erfahrener Benutzer

    Beiträge:
    188
    Erhaltene Danke:
    13
    Registriert seit:
    17.01.2010
  5. DGIR, 10.01.2011 #5
    DGIR

    DGIR Junior Mitglied

    Beiträge:
    37
    Erhaltene Danke:
    4
    Registriert seit:
    24.10.2009
    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;
                    }
                }
            }
        }
     

Diese Seite empfehlen