Zugriff auf sqlite db

  • Antworten:15
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 20

12.07.2012, 14:36:07 via Website

Hallo, meine Anwendung greift auf eine sqlite db zu die wahrscheinlich unter /data/data (ApplicationInfo.dataDir sagt das jedenfalls) gespeichert ist. Nun lasse ich diese DB (Struktur) per ORM (ORMlite) erstellen. Da bei der Auslieferung in der Datenbank bereits Einträge vorhanden sein sollen würde ich gerne die sqlite-Datei mit der bereits vorhanden Struktur herunterladen und mit Daten füllen. Anschließend diese in mein Eclipse Projekt legen, damit es alles in die apk Datei geschrieben werden kann/soll.

A ) Leider habe ich keinen Zugriff auf /data/data. Wie komme ich als nicht root an die Datenbank? Muss doch im normalen (ohne device rooten) Dev-Workflow irgendwie funktionieren.

B ) Aktuell habe ich eine Datei <AppName>.sqlite in dem Root Verzeichnis des Eclipse Projects. Dieser Dateiname wird auch dem Konstruktor von android.database.sqlite.SQLiteOpenHelper übergeben. Trotzdem wird die Datei ignoriert. Wie kann ich dafür sorgen, dass diese Datei als Basis genutzt wird.

Vielen Dank für eure Hilfe.

— geändert am 12.07.2012, 14:36:20

Antworten
  • Forum-Beiträge: 20

12.07.2012, 16:07:09 via Website

Harald Wilhelm
Zu A.) Device oder Emulator?
Device

Harald Wilhelm
Zu B.) Die Datei gehört in den assets Ordner.
Super, vielen Dank :)

Antworten
  • Forum-Beiträge: 20

12.07.2012, 18:14:18 via Website

Ich habe eine "Lösung" mit adb gefunden. Doch leider funktioniert es _nicht_ bei mir


"C:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" pull /data/data/<mein Namensraum>/<mein App Name>.sqlite "C:\Users\<mein Username>\workspace\<mein App Name>\assets\<mein App Name>.sqlite"

remote object '/data/data/<mein Namensraum>/<mein App Name>.sqlite' does not exist

Antworten
  • Forum-Beiträge: 20

16.07.2012, 11:13:06 via Website

Danke, aber leider bekomme ich nun Permission denied.

Woher kennst du eigentlich die Ordner? In der Dokumentation habe ich dazu nichts finden können. Oder habe ich nicht ausreichend gesucht?

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

16.07.2012, 12:38:02 via Website

Deshalb meine Frage in einem älteren Post "Device oder Emulator". Du benötigst dafür ein gerootetes Gerät. Sonst käme ja jeder an die Datenbanken aller Apps. Soweit die Theorie.

Da unter Android aber ohnehin fast jeder Benutzer rooten muss (es sei denn sein Gerät wird noch mit Updates versorgt) ist dieser Sicherheitsmechanismus vollständig ausgehebelt. Deshalb biete ich unter Android auch nur Apps an die z.B. auf öffentliche Links zugreifen oder wo nur auf mehr oder weniger unsensible Daten zugegriffen wird. Ich gebe den aktuellen Sicherheitsverfahren nicht mehr lange ...

Antworten
  • Forum-Beiträge: 20

16.07.2012, 13:38:25 via Website

Das rooten bekomme ich aktuell nicht hin. Odin bzw. Windows erkennt in dem Downloadmodus mein Gerät nicht mehr. Treiber sind aber installiert.
Deshalb habe ich versucht die Datenbank wo anders hin zu legen /sdcard/<name>.sqlite (Durch Konstruktor von SQLiteOpenHelper)
Aber leider kann er die nicht öffnen. Sehr komisch finde ich, dass er ohne die Pfadangabe anfangs mit leerem assets Ordner die DB erstellt hat. In diesem Fall aber einen Fehler meldet.

Gibt es eine einfache Lösung für mein Problem?

Antworten
  • Forum-Beiträge: 20

16.07.2012, 15:25:25 via Website

Im Emulator (Suboptimal) hat das Pull geklappt. Scheinbar funktioniert der import über den assets Ordner auch nicht. Ich habe die Anwendung deinstalliert und über Eclipse gestartet, nun bekomme ich den Fehler, dass die Tabelle nicht existiert. Diese Tabelle ist aber definitiv in der sqlite Datei die im assets Ordner liegt.

So langsam verzweifel ich an diesem Thema.

Antworten
  • Forum-Beiträge: 32

16.07.2012, 15:47:18 via Website

Hier einmal eine ganz andere Idee:
Ist es nicht einfacher, die Datensätze beim ersten App-Start mit eigenem Code in die Datenbank einzufügen? Dadurch ersparst du dir die ganzen Komplikationen mit der .sqlite Datei. Wenn es nicht so viele Datensätze sind, dann eignet sich eigener Code oder notfalls eine kleine Textdatei zum ersten Einfügen der Datensätze.

Antworten
  • Forum-Beiträge: 20

16.07.2012, 16:01:26 via Website

Habe ich zuerst auch dran gedacht. Aber bei ca. 28.000 Einträgen würde das halt sehr lange dauern.

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

16.07.2012, 16:33:55 via Website

In der Software-Entwicklung ist alles einfach - sofern man weiß wie es geht ;-)

Nur das ich das richtig verstehe:

* Du willst eine fertige DB mit der App ausliefern?

* Du prüfst ob /mnt/sdcard beschreibbar ist?

* Du hast die DB Datei korrekt erstellt?

* Du kopierst die DB Datei aus dem "assets Ordner nach /mnt/sdcard/<datenbankname>.db?

* Danach kannst Du diese Datei nicht öffnen?

* Du bist diese Schritte im Debugger abgelaufen und keiner dieser Schritte hat einen Fehler produziert?

Dann machst Du etwas falsch - das ist einfach ;-)

Ohne Code lässt sich wirklich nix sagen. Ja, es gibt einfache Lösungen:

http://stackoverflow.com/questions/513084/how-to-ship-an-android-application-with-a-database

Jörg V.

Antworten
  • Forum-Beiträge: 20

19.07.2012, 11:43:54 via Website

Hallo, ich habe die DB in den raw Ordner gelegt, da der assets Ordner Probleme mit zu großen und "komprimierten" (http://ponystyle.com/blog/2010/03/26/dealing-with-asset-compression-in-android-apps/) Dateien macht.
Nun könnte man das mit verschiedenen Workarounds lösen, was ich aber für einen std. Fall etwas schräg finde.
Anschließend kopiere ich es in den /data/data/.../databases Ordner.
In den /mnt/sdcard gehört es nach meinem Verständis nicht. Dies würde wieder ein Workaround sein.

Den Importfall habe ich nur über den Emulator lösen können. Debuggen der Anwendung geht, aber als dieser User auf dem System agieren geht zu diesem Zeitpunkt leider nicht. Sehr schade.

Ich möchte gerne (gerade bei std. Problemen) eine saubere Lösung. Natürlich kann man auch ein defektes Auto, dass den Berg runter rollt, als fahrend bezeichnen.

Trotzdem vielen Dank für deine Anmerkungen und Ideen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

19.07.2012, 12:17:41 via Website

Nur so am Rande:

* Du hattest die SD-Card ins Spiel gebracht (16.07.2012 13:38:25).

* Da ich die DB Größe nicht kannte habe ich den assets Ordner ins Spiel gebracht da für Objekte in diesem Ordner keine Ressourcen erzeugt werden. Das ist beim raw Ordner hingegen der Fall. Wenn die Datei über 1MB ist, gut, nimm den raw Ordner. Ich hatte mal in einem Projekt eine 30MB DB in 1MB Chunks geteilt (Binärsplitter), die Teile in den assets Ordner gelegt und auf dem Device zusammengesetzt. Auch das klappte.

Ich verstehe immer noch nicht Dein Problem. Was für ein User? Wenn Du das programmtechnisch machst dann hast Du doch Zugriff auf Dein App-Verzeichnis - das machen doch tausende Entwickler da draußen auch nicht anders. Was GENAU funktioniert nicht (das Kopieren, das Öffnen)? Du willst es per ADB machen? Das geht nur gerootet. Du willst es im Programm machen? Logo, das geht.

Werde bitte mal konkreter.

— geändert am 19.07.2012, 12:19:14

Antworten
  • Forum-Beiträge: 20

19.07.2012, 13:07:23 via Website

Harald Wilhelm
Nur so am Rande:

* Du hattest die SD-Card ins Spiel gebracht (16.07.2012 13:38:25).
Zu Testzwecken für den Export

Harald Wilhelm

* Da ich die DB Größe nicht kannte habe ich den assets Ordner ins Spiel gebracht da für Objekte in diesem Ordner keine Ressourcen erzeugt werden. Das ist beim raw Ordner hingegen der Fall. Wenn die Datei über 1MB ist, gut, nimm den raw Ordner. Ich hatte mal in einem Projekt eine 30MB DB in 1MB Chunks geteilt (Binärsplitter), die Teile in den assets Ordner gelegt und auf dem Device zusammengesetzt. Auch das klappte.
Und das findest du eine "normale" Lösung. Ich finde das heftig, um einfach nur einpaar Daten mitzugeben.

Harald Wilhelm

Ich verstehe immer noch nicht Dein Problem. Was für ein User? Wenn Du das programmtechnisch machst dann hast Du doch Zugriff auf Dein App-Verzeichnis - das machen doch tausende Entwickler da draußen auch nicht anders. Was GENAU funktioniert nicht (das Kopieren, das Öffnen)? Du willst es per ADB machen? Das geht nur gerootet. Du willst es im Programm machen? Logo, das geht.

Werde bitte mal konkreter.
Jede Anwendung läuft unter einem unterschiedlichen User (Sandbox). Wenn ich mich per SSH einlogge, bin ich mit dem User des SSH Servers unterwegs. Der darf aber nicht auf die Daten von meiner Anwendung die ich schreibe. Beim Debuggen hänge ich doch als der User der Anwendung die ich die debugge im System. Ich hätte es als sinnvoll empfunden, wenn ich z. B. per ADB zu dem Zeitpunkt, als der User auf dem System bewegen (Listings, Push, Pull etc.) kann.

Konkret meine Probleme.

Kein Export möglich (beschriebene Variante ist so nicht umgesetzt). Rooten zählt nicht. Lösung ist dort aktuell Emulator, auch wenn das unschön ist.

Import nur über Programmlogik möglich. Ich würde gerne zu der Anwendung eine DB liefern die bei der _Installation_ einfach die Basis bildet. Diese Möglichkeit habe ich aber nicht. Stattdessen muss ich dies splitten (assets) oder über eine Ressource (raw) mitliefern. Beides keine wirklich passende Varianten für das Vorhaben. Anschließend muss ich mich um das Kopieren bei dem ersten Start kümmern. Wieso beim Starten der Anwendung, eigentlich ist das ein Teil der Installation/Deploy. Wann ist es eigentlich der erste Start. Selbst dies muss ich mit Programmlogik regeln.

Antworten

Empfohlene Artikel