Datenbankzugriff auf Appfremde SQLite-Datenbank

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datenbankzugriff auf Appfremde SQLite-Datenbank

    Hallo Zusammen,

    bitte seht es mir nach, wenn meine Problemlösung irgendwo im WWW schon vorliegt, leider habe ich nicht die Zeit das ganze WWW zu durchsuchen.
    bitte auch nicht vom langen Text abschrecken lassen, es steckt einiges an Testerei in meinem Problem.



    Zu meiner App:
    bei meiner aktuellen App handelt es sich um ein durchsuchbares Verzeichnis, also eine Datenbank App. Diese ist bereits meine zweite Datenbankapp, wobei die erste reibungslos funtioniert. Allerdings haben beide einen wesentlichen Unterschied.

    In meiner ersten App erzeuge ich eine komplett neue Datenbank, speichere eingegebene Informationen einfach nur ab und greife innerhalb der App wieder darauf zu.

    Mit meiner aktuelle zweite Datenbank-App greife ich auf eine bestehende Datenbank zu und möchte diese durchsuchen lassen nach bestimmten Infos. Die zugrunde liegende Datenbank habe ich zuallererst mit einem kostenlosen Program dem "SQL Expert Personal 3" erzeugt und mit Daten gefüllt.
    Nach dem Füllen habe ich keinen Zugriff auf die Datenbank bekommen, immer wieder Fehler beim Öffnen.
    Beim Lesen verschiedener Quellen war ich mir unsicher geworden ob androidapps auf appfremde SQLite_Datenbanken zugreifen können. Danach erzeugte ich die Gleiche leere Datenbank mit meiner App und füllte sie nachträglich wieder mit dem bereits genannten Datenbankprogramm, was übrigens sehr einfach funktioniert.
    Doch auch dieser Datenbankzugriff funtioniert nicht. Es kommt die Fehlermeldung "no such table". Dazu muss ich noch erwähnen, dass ich die fertige, mit der App erzeugte und mit "SQL Expert" gefüllte, Datenbank im Assets-Ordner hinterlegt habe und sie von meiner App ins Stammverzeichnis kopiere. In einem auch von mir genutzten Emulator, WindowsAndroid (nutze ich hin und wieder, da hier ein Rootzugriff möglich ist), habe ich die App ebenfalls mit Fehlermeldungen gestestet und kann im entsprechenden Stammverzeichnis die Datenbank auch mit dem Datenbanktool öffnen. Es sind alle Infos darin vorhanden.

    Nach dem durchsuchen einiger Internetquellen gibt es ja noch andere Möglichkeiten fremde Datenbanken zu öffen, ich habe von Content-Provider gelesen, vielleicht ist auch dass appinterne Füllen der Datenbank über eine CSV-Datei eine sinnvolle Lösung. Das sind Möglichkeiten die meine App allerdings immer komplexer und voluminöser machen und mir auch ein wenig wie "Mit Kanonen auf Spatzen zu schießen" ist . Deshalb meine ganz konkrete Frage.

    Muss sich diese von meiner App erzeugte und fremdbefüllte Datenbank von meiner App öffnen lassen oder steckt in meinem Datenbanktool das Problem, das ich habe.
    Man muss bedenken, dass diese App die Datenbank nur beim ersten Start korrekt Öffnen/Erzeugen/Kopieren muss. Ab dem zweiten Start der App sollte die Datenbank ordnungsgemäß vorliegen.

    Wie würdet ihr bei diesem Problem vorgehen? Welchen Weg würdet ihr empfehlen?
  • Hallo ChampS,
    danke für die Nachricht, ich muss gleich mal erwähnen, dass ich ich zuletzt von meinem WindowsAndroid zum USB-Debuggen auf nem HUAWEI gewechselt bin. Nachdem ich diese Woche deine Nachricht las, habe ich die Fehlermeldung noch einmal genauer studiert. Da ich jetzt mal davon ausging, dass die Datenbank korrekt ist und sie auch im richtigen Ordner lag, konnte es nur bedeuten, dass die Datenbank nicht gefunden/geöffnet wird.

    Nach etwas stöbern im Netz nach dem folgenden Fehler:


    08-25 12:22:30.559: E/Fehler(19565): no such table: EW(Sqlite code 1): , while compiling: SELECT * FROM EW,(OS error - 2:No such file or directory)

    habe ich nochmal meinen Lesepfad kontrolliert. Jetzt hab ich den Fehler gefunden. Es lag an einem falsch positionierten Backslash. Aber die beste Nachricht daran ist, dass meine selbst gestrickte Datenbank funktioniert. :)
    Schlage mich gerade noch mit einem Hinweis herum, der beim Debuggen vorschlägt, dass ich die Datenbank nach der Benutzung auch schließe.

    Da ich das in meiner MainActivity bereits eingebaut habe, nicht ganz nachvollziehbar, aber das hat bei mir jetzt nicht so die Priorität. Es gibt noch andere nicht fertiggestellte Bereiche der App.
    Arbeit habe ich also noch genug....
  • Mag völliger Schwachsinn sein, aber meiner Erinnerung nach läuft jede App in ihrer eigenen 'Sandbox'.
    Soll heißen: Auch wenn die Datenbank an der Stelle liegt, die Du kennst und auch wenn Du sie via adb o.Ä. herunterziehen und reinschauen kannst, bedeutet es noch lange nicht, dass Deine App das auch kann.

    Die arbeitet in einer vorgegaukelten Root-Umgebung, das heißt, was auf Deiner SD als 'data/com.example.app2' zu sehen ist, wird der App als '/' dargestellt. Und höher als '/' kommt sie nicht.

    Das wird eigentlich seit Jahren auf Unix Systemen so gemacht.
    Im Webbereich hat jeder virtuelle Apacheserver einen so genannten Document Root, der dasselbe macht.
    Bei FTP-Servern lässt sich ein FTP-Benutzer in so einem Unterverzeichnis 'einsperren'.
    Einige Linux-Distributionen nutzen eine derartige chroot Umgebung für die Installation.
    Ganze Server lassen sich in virtuellen Maschinen in ein eigenes Unterverzeichnis 'sperren'.

    Eben dafür gibt es diese Content Provider.

    Da die erste App ja auch Dir gehört solltest Du dort ein Update mit dem Content Provider herausbringen und Deine zweite App darauf aufbauen.
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.

    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«
  • Danke Marco,

    mir fehlt das Fachwissen, was Zugriffsrechte etc. betrifft, habe deine Ausführung aber in soweit verstanden, als dass die Kommunikation mit Appfremden Datenbanken oder Servern ausschließlich über einen Content Provider laufen sollte, da der Zugriff auf meist nur ein einzelnes Unterverzeichnis beschränkt ist. Ist definitiv mein Ziel und wird auch als Update umgesetzt.
    Ich muss allerdings hinzufügen, dass meine erste sowie die zweite App letztlich doch Daten aus einer internen Datenbank holen. Nur die Erzeugung in beiden Fällen ist unterschiedlich gelaufen.

    Der Fehler bei mir im Code war tatsächlich dass ich einen Backslash am Ende meines Pfades hatte, der nur nötig gewesen wäre wenn ich meine Datenbank in einem Unterordner von databases abgelegt hätte. Am Funktionieren beider Apps wird der Content Provider nach meinem Verständnis also nichts ändern.

    Für ein Update der zweiten App kommt er aber absolut in Frage.
  • ich bin auch davon ausgegangen das die datenbank nicht irgendwo auf einer sd karte liegt, sondern mit der app ausgeliefert wird. Du kannst die selbst befüllte datenbank ja auch im APK platzieren. Du kannst über das Android Framekwork aber theoretisch auch auf files auf der SD Karte, also beispielsweise eine Datenbank zugreifen. Ob das allerding ratsam wäre ist wieder eine andere geschichte.
  • Hallo zusammen,

    nun hatte ich euch schon etwas über meine App berichtet und euch Fragen gestellt. Die App an sich läuft soweit gut und tut ihren Dienst, deshalb habe ich die App zu Test als Beta-version im Google Playstore hochgeladen. Das Thema mit dem Datenbankpfad ist bei mir bei meiner neuen App wieder aktuell. :(
    Wenn ihr interessiert seid die App euch anzuschauen, dann schreibe ich euch hier den Link dazu:

    play.google.com/apps/testing/de.MarkusC.raillock

    Die App ist nur für Smartphones zwischen 4,7-5,1" Displays ausgelegt. Wenn ihr Zeit und Lust habt, nehme ich Feedback gerne an.

    Danke für Eure Antworten.