DB soll nach Installation schon gefüllt sein

  • Hallo Allezusammen,


    ich habe eine App, in der sich eine SQLite-DB befindet.
    Wenn ich nun die .apk auf dem Handy installiere, soll die DB direkt gefüllt sein.
    Ist das nur möglich indem ich eine Funktion schreibe, die die Daten direkt nach der Installation einfügt?
    Das ist bei großen Datenmengen natürlich sehr umständlich und unübersichtlich.
    Ich benutze zum Anschauen meiner DB z.B. den SQLite Database Browser.
    Mit dem kann ich ja eine .sql Datei erstellen. Ist es möglich, diese .sql Datei mit in die .apk "einzubinden"?
    Besten Dank schonmal


    M3doXX

  • Hi,


    hab immer ne DB Klasse, die von SQLiteOpenHelper erbt. Direkt beim ersten Start der App springt der dann in die onCreate, bzw. nach einem Update der Version ins onUpgrade. Dort kann man seine Datenbank befüllen, bearbeiten, usw. Die SQL Querys dafür hab ich in ner eigenen .xml datei im values ordner und les die einfach mit

    Java
    String[] sqls = context.getResources().getStringArray(R.array.create);
    		for (String sql : sqls) {
    			db.execSQL(sql);
    		}


    aus. In der XML schauts nach dem Schema aus


    Gruß,
    matze

  • Hallo Matze,


    also ich habe auch eine MySQLiteHelper, die mir am Anfang die Tabellen erzeugt.
    Wie ich dann die Daten reinkriege, weiß ich auch.
    Ich suche nur nach einem bequemeren Weg die Daten einzugeben, als direkt in den Quellcode.
    Grund ist folgender: Ich habe eine Datenbank mit 10 "Spalten". Ich werde am Ende aber ca 100 Datensätze haben.
    Wenn ich die jetzt alle mit INSERT INTO ... einfügen muss, ist das sehr umständlich, vor allem wegen den Anführungszeichen.
    Ich würde das lieber über eine "Eingabemaske" oder ähnliches machen, wie z.B. bei Excel oder SQLLite Database Browser.
    Da klicke ich nur die passende Spalte, bzw Zeile an und kann die Daten eintragen.
    Ich hoffe du hast verstanden was ich meine ;)
    Gibt es da eine Möglichkeit?


    Gruß


    M3doXX

  • Ja ich hab mich auch ein bisschen blöd ausgedrückt ;)
    Das mit dem Asset Ordner scheint die richtige Lösung zu sein! Dafür schonmal aller Besten Dank!!!
    Allerdings habe ich meine MySQLiteHelper Klasse jetzt nach einem Tutorial angepasst, aber es passiert gar nichts!?!
    Ich habe dieses Tutorial benutzt:
    http://www.reigndesign.com/blo…-in-android-applications/
    Und jetzt sieht meine MySQLiteHelper so aus:



    Ich kriege weder eine Exception noch stürzt er ab. Es passiert einfach gar nichts.
    In der onCreate werden ja die Tabellen erstellt. Jetzt hab ich einfach darunter noch die neue Methode copyDataBase() gesetzt.
    Ich habe die App aufm Emulator komplett deinstalliert und wieder installiert.
    Über eine Lösung für das Problem würd ich mich sehr freuen ;)
    Gruß


    M3doXX

  • Hallo M3doXX,


    was heisst genau "Es passiert einfach gar nichts"? Bleibt deine APP hängen, oder kopiert er einfach die Datenbank nicht?
    Am besten mal einen Breakpoint setzen und step-by-step durchgehen, ansonsten ist sehr schwer zu sagen was
    das Problem ist, vorallem wenns keine Fehlermeldung gibt (auch im LogCat nicht?)
    Einzige spontante Idee: Wenn du die App komplett deinstalliert hast, kann es sein dass es den Ordner "/...glandorf/databases"
    noch nicht gibt? Oder wird der vom SQLiteOpenHelper erstellt? Arbeite normalerweise ohne den Helper...


    Du kannst mal proberen denn String DATABASE_PATH in deiner "public MySQLiteHelper(Context context){ .."
    mit "DATABASE_PATH = this.myContext.getFilesDir().toString() + "/";" zu füllen.


    Gruss
    antifish

    Ich kriege weder eine Exception noch stürzt er ab. Es passiert einfach gar nichts.
    In der onCreate werden ja die Tabellen erstellt. Jetzt hab ich einfach darunter noch die neue Methode copyDataBase() gesetzt.
    Ich habe die App aufm Emulator komplett deinstalliert und wieder installiert.
    Über eine Lösung für das Problem würd ich mich sehr freuen ;)
    Gruß


    M3doXX

  • Das nichts passiert, heißt das er die Datenbank einfach nicht kopiert. Es gibt keine Fehlermeldung, nichts!
    Also den Ordner gibts im Emulator und der Pfad müsste auch richtig sein.

    Zitat

    Du kannst mal proberen denn String DATABASE_PATH in deiner "public MySQLiteHelper(Context context){ .."


    mit "DATABASE_PATH = this.myContext.getFilesDir().toString() + "/";" zu füllen.

    Dann kriege ich folgende Fehlermeldung:


    Code
    The operator / is undefined for the argument type(s) java.lang.String, java.lang.String


    Was kann ich tun? Ich verzweifle hier gerade!! :-/
    Gruß


    M3doXX


  • Mhhh probier mal... + "\/"

  • "Syntax error on token "Invalid Character", delete this token"


    Dabei markiert er den Backslash!


    Edit: Aber wie gesagt, am Pfad dürfte es eigentlich nicht liegen..


    Edit2: Ich hab mir jetzt mal die Variablen myInput, outFileName und myOutput ausgeben lassen.


    myInput: android.content.res.AssetManager$AssetInputStream@4052b2f0
    outFileName: /data/data/spielesammlung.glandorf/databases/spielesammlung.db
    myOutput: java.io.FileOutputStream@4052b968


    Der Pfad ist richtig. Mit den anderen beiden Ausgaben kann ich ehrlich gesagt nichts anfangen. Kann das richtig sein?
    Die Methode wird bis zum Ende ausgeführt ohne Fehlermeldung, aber die DB bleibt leer?!?!

  • Wird das File dann erstellt und bleibt einfach leer? Oder gibts gar kein File? Kannst du mal prüfen wie oft er die Schleife macht wo du Inputstream liest und in Outputstream schreibst?
    Ansonsten machst du ein .zip File des Sourcecodes (inkl asset) und schickst mal rüber, kann nur ein kleiner Fehler sein..


    Gruss
    antifish

  • Also ich hab jetzt mal was ganz neues versucht und bin schon ein Stückchen weiter.
    Undzwar hab ich einfach mal komplett den Code aus dem Tutorial benutzt und es funktioniert (mit Fehlermeldungen).
    Wenn ich die App öffne kriege ich sofort einen SQL Fehlercode 14.


    Code
    sqlite returned: error code = 14, msg = cannot open file at source line 25467
    und
    sqlite3_open_v2("/data/data/spielesammlung.glandorf/databases/spielesammlung.db", &handle, 1, NULL) failed


    und wenn ich die Activity wechsle, dann kommen noch viel mehr Fehlermeldungen von wegen ich hätte die Datenbank nicht geschlossen.
    Es funktioniert zwar und er bricht nicht ab oder ähnliches, aber mein LogCat ist auf einmal vollkommen rot und das ist ja auch nicht das Wahre ;)
    Wo genau muss ich die DB denn schließen? Oder ist das vielleicht auch ein anderer Fehler?
    Hier nochmal der Code:


    MySQLiteHelper:


    Und hier der Teil in meiner Main-Activity, der die Datenbank erstellt und öffnet:



    Edit: wenn ich die apk auf dem Handy installiere, dann werden die Daten nicht eingefügt!?



    DANKE!!!! M3doXX

  • Also folgendes:


    Ich habe deinen Code mal übernommen. Wenn ich die openDataBase() weglasse, dann funktioniert es einwandfrei(im Emulator!!).
    Braucht man die openDataBase() gar nicht?
    Auf dem Handy funktioniert es mit dem Code auch nicht. ;(
    Ich weiß auch nicht genau ob ich deinen Code richtig eingebunden habe.
    Ich habe eine MainActivity, die eine Implementation von einem TabWidget enthält. Diese Tabs rufen ja weitere Activitys auf.
    Ich habe die createDataBase() nun in der Activity eingebaut, die beim Aufrufen der App als erstes unter den Tabs angezeigt wird.
    Woran kann es denn liegen, dass es im Emulator einwandfrei funktioniert, aber auf dem Handy nicht?
    Aber nochmals: Besten Dank für deine Bemühungen bis hier hin!!!!


    Gruss


    M3doXX

  • Hallo M3doXX,


    was heisst denn "es funktioniert nicht"? Absturz? Oder .DB wird nicht kopiert? Oder sonst was?
    Einfach so kann ich dir das nicht sagen, wo das Problem liegt.
    Am besten postet du mal die Ausgabe vom LogCat (kannst du ja in Eclipse zuschalten und nach deiner App filtern, dann siehts
    du all die unnötigen anderen Messages nicht)


    Mit was für einer Android Version startest du dein Emulator? Und was für eine hast du auf dem Handy?


    Gruss
    antifish

  • Also wie gesagt: Im Emulator funktioniert alles ohne Probleme und ohne Fehlermeldungen.
    Der Emulator hat Version 2.3.3 und mein Handy (HTC Desire HD) hat Version 2.3.5.
    Auf dem Handy funktioniert die App auch normal, aber er kopiert die Daten nicht mit!
    Da sind die ListViews dann leer.
    Kann ich die LogCat Ausgabe auch irgendwie vom Handy kriegen?
    Ich hatte schon überlegt, ob es an den Permissions liegt...Hab die WRITE und READ EXTERNAL STORAGE reingesetzt, funktioniert trotzdem nicht.
    Gruss


    M3doXX


    EDIT: Hä?? Jetzt hab ich die App einmal direkt von Eclipse über mein Handy gestartet und jetzt funktionierts...
    Sonst hab ich die apk immer aufs Handy geladen und dann so installiert. Habe das auch nochmal probiert, das geht jetzt auch!?!?!
    Also es geht auf jeden Fall jetzt...
    Aller Besten Dank für deine Hilfe und deine Geduld!!!!

  • Hi,


    Super das es jetzt klappt. Das währe mein nächster Vorschlag gewesen, also die App mal komplett zu deinstallieren. Wahrscheinlich hatte das starten über Eclipse den selben Effekt. Vielleicht war deine sqlite db noch alt oder sonstige "Leichen" von einer älteren APK.
    Würde dir sowieso mal das debugging mit dem angeschlossen handy, ein paar Breakpoints setzten, etc, empfehlen, macht das Leben sehr viel einfacher :)


    Gruss
    antifish

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!