SQLite Datenbank bei Update neu erstellen!

  • Antworten:10
Nimrare
  • Forum-Beiträge: 26

30.08.2014, 13:53:05 via Website

Hallo miteinander!

In meiner App verwende ich eine SQLite Datenbank die schon beim ersten Verwenden mit Einträgen befüllt sein muss.
Dazu habe ich ein Textfile im Raw-Folder, dass in der @Override onCreate Methode des dbHelpers gelesen wird und die Datenbank befüllt wird.
Bei einem Update der App über den Playstore würde ein neues Textfile im Rawfolder liegen, da die Datenbank schon existiert, wird der neue Inhalt nicht nachgeladen.
Wie kann ich denn die onCreate Methode erzwingen?

Achja, und ist diese onCreate Methode asynchron?
Oder sollte ich diese 'Befüllroutine' in so etwas wie einen AsyncTask packen, dass es bei großen Textfiles keine Verzögerungen beim ersten Startup der App gibt.

Ich hoffe alles ist soweit verständlich. Sonst einfach nachfragen.

glg

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.08.2014, 14:20:37 via App

Die onCreate ist nicht asynchron.
Kannst du uns mal den Code zeigen?
Muss nicht unbedingt asynchron sein kommt auf den Aufbau an und die Zeit die es benötigt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Nimrare
  • Forum-Beiträge: 26

01.09.2014, 11:49:24 via Website

Also ihr könnt euch mal die App im PlayStore ansehen. Sie heißt 'Swush'.
Würde mich interessieren ob da beim ersten Start was ruckelt.

Momentan sind etwa 200 Zeilen in dem Textfile. Hab den genauen Code jetzt nicht parat aber momentan passiert folgendes in der sqlHelper class (extends SQLiteOpenHelper):

@Override
public void onCreate(SQLiteDatabase db){
      //lies text file
      //fuege zeilen in datenbank ein
}

— geändert am 01.09.2014, 11:50:25

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.09.2014, 17:22:50 via Website

Wenn es wirklich ruckelt, (selbst nicht getestet)
dann solltest du das Laden in einen Thread/AsyncTask auslagern.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Micha Roth
  • Forum-Beiträge: 26

04.09.2014, 13:29:08 via Website

Also,
ich schlage mal noch andere Möglichkeiten vor:

(1) Einmal könntest du die Tabelle mit der APP direkt mitlieferen, dann müsstest du sie gar nicht erst befüllen. Die SQLite-Tabelle speicherst du dafür im Ordner "assets". Genauso wie im Tutorial hier, habe ich auch schon ausprobiert, das funzt, alternativ google: use existing android table
EDIT: Eigentlich sollte "hier" klickbar sein, geht aber gerade iwie nicht, hier der Link so: www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

Um an deine SQLite-Tabelle zu bekommen, startest du den Emulator und dort kannst du sie einfach rauskopieren. Google: Database from Emulator android
Da findet sich bestimmt was.

(2) Damit die Tabelle beim Update neu erstellt wird, musst du checken, ob sie schon existiert, dafür könnte dir folgende Methode helfen:

private boolean checkDataBase(){

    SQLiteDatabase checkDB = null;

    try{
        String myPath = DB_PATH + DATABASE_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){

        //database does't exist yet.

    }

    if(checkDB != null){

        checkDB.close();

    }

    return checkDB != null ? true : false;
}

Und so führst das aus:

boolean dbExist = checkDataBase();

    if (dbExist) {
        System.out.println("Die Datenbank existiert bereits");
        // do nothing - database already exist
    } else {
                //Datenbank existiert
}

Alternativ könntest du auch einen Splashscreen erstellen, wo der Benutzer solange verharrt, bis die DB befüllt ist. Dann merkt der Benutzer gar nichts vom Ruckeln.

Habe deine App mal geladen, da hat nichts geruckelt (Motorola Moto G, 8GB)

Schau dir ruhig auch mal meine APP an und/oder bewerte/kritisiere sie.

Viele Grüße von

Stirnraten.de

PS: Witzige Idee das Swush

— geändert am 04.09.2014, 13:32:04

Antworten
Jakob N.
  • Forum-Beiträge: 282

04.09.2014, 17:03:28 via App

@Micha Roth: Was ist eigentlich ein Splashscreen?

LG Jakob

Antworten
Jakob N.
  • Forum-Beiträge: 282

04.09.2014, 17:46:10 via App

@Ludy: Ah verstehe danke! :) Habe das in meiner App nur mit einem ProgressDialog gelöst.

LG Jakob

Antworten
Nimrare
  • Forum-Beiträge: 26

04.09.2014, 20:20:20 via Website

Danke für deinen Tipp Micha!

Diese Methode gefällt mir echt gut. Ich denke, wenn es mehr Linien werden, werde ich die App demenstprechend modifizieren.
Btw. reicht es nicht beim Update aus, wenn ich eine neue Datenbank in die Assets kopiere und die DB Version erhöhe?
Momentan mache ich es auch so.

Bzw. deine App ist ja mal eine witzige Idee. Ich liebe das Spiel, habs aber bisher immer klassisch gespielt. :)

Antworten
Micha Roth
  • Forum-Beiträge: 26

05.09.2014, 02:03:04 via Website

Diese Methode gefällt mir echt gut. Ich denke, wenn es mehr Linien werden, werde ich die App demenstprechend modifizieren.
Btw. reicht es nicht beim Update aus, wenn ich eine neue Datenbank in die Assets kopiere und die DB Version erhöhe?
Momentan mache ich es auch so.

Ehrlich gesagt weiß ich das gar nicht. Wenn es bei dir auch so funktioniert, würde ich das einfach so lassen. ;)
Ich ersetze bei einem Update die alte DB durch die neue. Das funktioniert auf jeden Fall auch, so lange sich nicht die Datenbankstruktur, sondern nur die Inhalte ändern.

Bzw. deine App ist ja mal eine witzige Idee. Ich liebe das Spiel, habs aber bisher immer klassisch gespielt. :)

Danke :)

Antworten