sqlite Datenbank unter Android 4.4 wird nicht gefunden

P

pyretta

Ambitioniertes Mitglied
1
Hallo,

hier mal meine Ausgangssituation/Entwicklungsumgebung: Eclipse Standard/SDK Luna Release (4.4.0), Android SDK Tools 23.0.2, PhoneGap 2.5.

Ich versuche eine vorgefertigte Datenbank an den "richtigen" Speicherort zu kopieren. Für alle Android Versionen < 4.4 funktioniert das auch wunderbar. Ab 4.4 findet die App die Datenbank nicht mehr - folglich muss sich etwas an der Verzeichnisstruktur geändert haben.

Code innerhalb "onCreate":
Code:
/** Kopieren der schon existierenden Datenbank - nur EINMAL beim ERSTEN Start der App nach der Installation **/      
         boolean firstrun = getSharedPreferences("PREFERENCE_1", MODE_PRIVATE).getBoolean("firstrun", true);
         if (firstrun){
            //Use this code in your bootstrapping steps like in onCreate()
             try{
                  String pName = this.getClass().getPackage().getName(); //output: packagename
                  String appInfo = getApplicationInfo().dataDir; //output: /data/data/packagename                 
                  
                  if(android.os.Build.VERSION.SDK_INT >= 19){
                      this.copy("Databases.db", appInfo +"/databases/");
                       this.copy("0000000000000001.db", appInfo +"/databases/file__0/");
                      
                  }else{
                      this.copy("Databases.db", appInfo +"/app_database/");
                       this.copy("0000000000000001.db", appInfo +"/app_database/file__0/");
                  }              
               }
                  catch (IOException e)
              {
               e.printStackTrace();
              }             
         
         getSharedPreferences("PREFERENCE_1", MODE_PRIVATE)
             .edit()
             .putBoolean("firstrun", false)
             .commit();
         }

Hier der Code für das eigentliche kopieren:
Code:
     void copy(String file, String folder) throws IOException 
     {

      File CheckDirectory;
      CheckDirectory = new File(folder);
      if (!CheckDirectory.exists())
      { 
       CheckDirectory.mkdir();
      }

         InputStream in = getApplicationContext().getAssets().open(file);
         OutputStream out = new FileOutputStream(folder+file);

         
         byte[] buf = new byte[1024];
         int len; while ((len = in.read(buf)) > 0) out.write(buf, 0, len);
         in.close(); out.close();
         
     }

Ich habe schon folgende Verzeichnispfade ausprobiert, bisher ohne Erfolg:

für die "Strukturdatei" Databases.db:
data/data/packagename/app_webview/databases/
data/data/packagename/app_database/
data/data/packagename/databases/

für die eigentliche Datenbank "0000000000000001.db":
data/data/packagename/app_webview/databases/file__0/
data/data/packagename/app_database/file__0/
data/data/packagename/databases/file__0/

Wie lautet denn nun der korrekte Verzeichnispfad für Android 4.4.x?

Oder liegt es vielleicht gar nicht an der Java Klasse, sondern eher an PhoneGap 2.5? Verweist PhoneGap 2.5 standardmäßig auf ein bestimmtes Verzeichnis für die Datenbank? Kann ich das dort auch Versionsabhängig ändern? Wenn ja, wie?

Ich habe schon reichlich viele Lösungsvorschläge über stackoverflow gefunden und auch ausprobiert, aber leider brachte mir das alles nichts. Der Fehler bleibt bestehen. Zum Beispiel: javascript - SQLLite database not working in Android 4.4 - Stack Overflow

Vielleicht hat ja jemand ein ähnliches Problem bereits lösen können?
Würde mich freuen über jeglichen Input.
Vielen Dank.
 
pyretta schrieb:
Wie lautet denn nun der korrekte Verzeichnispfad für Android 4.4.x?
Kurz für dich per Rootexplorer nachgeschaut.
Meine App legt ihre Datenbank im internen Speicher ab (alles nativ) und der Pfad dorthin lautet:
/data/data/packagename/databases

Wie man das aber nun unter Phonegap bewerkstelligt, das überlass ich anderen Experten :)
 
  • Danke
Reaktionen: pyretta
pyretta,

hast Du kein Emulator und Debugger um den Code zu untersuchen ?
Oder kannst Du nur den fertigen Code in PhoneGap einbinden und
hoffen dass er funktioniert ...

Scheint mir bald so, sonst sollte Dir bei dem Problem ein weiteres
aufgefallen sein.
Code:
getSharedPreferences("PREFERENCE_1", MODE_PRIVATE).edit().putBoolean("firstrun", false).commit();
sollte im TRY-Block stehen und nicht hinter der schließenden CATCH-Klammer.
 
@kleinerkathe: Vielen Dank für deine Antwort. Gut, dann muss ich mir doch mal die PhoneGap JS ansehen, ob ich da etwas ändern kann.

@RED-BARON: Vielen Dank für deinen Hinweis. Wie du ja sicher bereits im ersten Satz meines Posts gelesen hast, arbeite ich mit eclipse, das bietet i.d.R. eine sehr gute Debugmöglichkeit. Allerdings wurde mir das was du anmahnst nie als fehlerhaft angezeigt. Folglich ist es mir nicht aufgefallen, zumal die App auf allen Android-Geräten < Android 4.4.x bestens funktioniert. Aber du hast natürlich Recht, vielen Dank, ich werde das gleich ändern.
 
war auch nur ein logischer Fehler der Dir niemals angezeigt werden wird.
Oder auch kein Fehler, wenn es egal ist ob die Installation erfolgreich war.

Im Emulator (DDMS|FileExplorer) siehst Du deine kompletten Pfade und Dateien.
Ein breakpoint bei e.printStackTrace(); sollte Dir helfen.
 
@RED-BARON: Mann kannst du einen durcheinander bringen. Das was du gesagt hast, dass "getsharedpreferences" innerhalb der try Schleife gesetzt werden müsste, ist ja gar nicht richtig. Hast mich verunsichert, weil ich dachte einen Profi vor mir zu haben. Wenn ich deinem Rat nämlich folgen würde, geht die App nur ein einziges Mal - danach kommt nur noch ein weißes Bild. War ja auch klar, hat ja vorher alles wunderbar fehlerfrei funktioniert.

Nur eben der Teil der App der mit der Datenbank gespeist werden soll, funktioniert nur tadellos bis Android 4.3. Das ist auch der Grund für diesen Foreneintrag....

Ab Android 4.4.x findet es die Datenbank nicht mehr. Dann sagt mir chromium bzw. cordovalog im LogCat, die Datenbank wäre "undefined" und ein SQLError gibt mir aus, dass die angefragte Datenbank nicht existieren würde. Aber eben alles nur mit Android 4.4.x.

Wenn ich die App auf einem Emulator installiere und im DDMS File Explorer schaue, dann hat es die Datenbank auch immer richtig abgespeichert, aber er findet sie einfach nicht.

Ich habe jetzt von PhoneGap 2.5 auf PhoneGap 2.8 aktualisiert. Leider brachte das auch nichts.

Hat denn keiner ein ähnliches Problem bereits gehabt und lösen können?
 
Zuletzt bearbeitet:
Code:
/** Kopieren der schon existierenden Datenbank - nur EINMAL beim ERSTEN Start der App nach der Installation **/      
         boolean firstrun = getSharedPreferences("PREFERENCE_1", MODE_PRIVATE).getBoolean("firstrun", true);
         if (firstrun){
             try{
  throw new IOException("Fehler beim Kopieren");
               }
              catch (IOException e)
              {
               e.printStackTrace();
              }             
 // wenn Fehler oder kein Fehler, dann setze NIE wieder firstRun=true
         getSharedPreferences("PREFERENCE_1", MODE_PRIVATE)
             .edit()
             .putBoolean("firstrun", false)
             .commit();
         }

Du hast natürlich Recht, der Kommentar sagt nichts über Erfolg oder Misserfolg aus
/** Kopieren der schon existierenden Datenbank - nur EINMAL beim ERSTEN Start der App nach der Installation **/

Wenn beim ersten Start die Datenbank nicht kopiert werden konnte, dann
kann der App das egal sein. Soll sich der Anwender ohne Fehlerausgabe doch selbst bemühen ... :thumbsup:
Wenn er die Ausgabe von e.printStackTrace(); für sich irgendwie sichtbar
machen kann wird es ihm sicher helfen

Warum der Bildschirm bei Dir weiss bleibt hat sicher auch einen (anderen) Grund. Folgefehler ?

Dein Code funktionierte sicher bisher auch nur, weil deine Datenbank immer kleiner war/ist als die Hälfte des internen Speichers ...

Abgesehen davon erhälst Du nun einen "SQLError", also keine IOException ...

Kopiere doch den relevanten LogCat hier rein. Evtl. hilf das weiter.
 
Nee, ist schon gut. Ich merk schon, muss wohl eine total dumme Frage sein die ich gestellt hab. Ansonsten könnte man ja anständige Antworten geben, ohne auf jemandem rumzukloppen. Aber dazu müsste man ja auch die Frage erstmal lesen. Aber da man das nicht will und sich lieber an irgendwas wo man sich sicher fühlt aufhängen will um sich zu produzieren, wird das wohl nichts mehr.

Also, tut mir leid eure Zeit verschwendet zu haben.
 
@pyretta

Das waren keine dummen Fragen und hier will sich keiner produzieren.

Der Code in deiner try - Block wirft ein Fehler. D.h er wird nicht ausgeführt. Wenn du den Aufruf deiner SharedPreferences in den try - Block verschiebst, wird er nicht ausgeführt, weil schon vorher ein Fehler geworfen wurden.

Deshalb erscheint ein weißer Screen. Da ist etwas abgestürzt.

Existiert überhaupt der Ordner file__0/, wenn du die Datenbank dort hinein kopierst?

Wenn du deinen Fehler veröffentlichen würdest, könnte dir hier vielleicht jemand wirklich helfen. ;)
 

Ähnliche Themen

R
Antworten
6
Aufrufe
1.024
swa00
swa00
B
Antworten
4
Aufrufe
521
bb321
B
Zurück
Oben Unten