![]() |
Datenbank: SQLite • Version: 4 • Zugriff über: Unidac
SQLite unter Android
Hallo zusammen,
ich spiele im Moment etwas mit Firemonkey herum und wollte eine SQLite Datenbank auf eine SD Karte packen und dann mit Unidac darauf zu greifen. Abgesehen davon das ich Probleme habe direkt unter Windows etwas auf die Karte zu kopieren (mache das mit nem Adapter und schreibe direkt auf die Karte), welches Verzeichnis muss ich der Uniconnection angeben? UniConnection1.Database := '/storage/sdCard/data.sqlite'; ? Ich habe da schon etwas probiert bekomme aber immer Could not open Database. Lg Mirko |
AW: SQLite unter Android
Dafür brachst Du kein UniDac, es geht mit FireDac.
Und die Datei kannst Du der App per Deployment mitgeben, falls dir das etwas weiterhilft. Auf externe Files wirst du u.U. nur begrenzt zugreifen können, weil die App in einer Sandbox lebt. Dann wäre es eventuell besser eine DB-Datei per Internet auszutauschen. Rollo |
AW: SQLite unter Android
Hallo Rollo,
Danke für die Info. Ich habe das gerade mal probiert. Als Verzeichnis habe ich im Deployment einfach "./" gewälht. Ich habe in der testdb.sqlite eine Tabelle namens testtab, die ich unter Windows mit SQLiteManager erzeugt habe. Wenn ich nun die Verbindung mache bekomme ich "no table testtab". Woher kommt das? Aber die Verbindung funktioniert jetzt. Ich nutze folgenden Code: UniConnection1.Database := './testdb.sqlite'; UniConnection1.Connect; if UniConnection1.Connected = false then ShowMessage('Keine Verbindung zur Datenbank') else ShowMessage('Verbunden'); <- Zeigt er so an ! UniQuery1.Close; UniQuery1.SQL.Text := 'SELECT * from testtab'; UniQuery1.Execute; <- no such table testtab LG Mirko |
AW: SQLite unter Android
Du kannst versuchen einfach über Projekt\Resources und Images die Datei als Ressource anzulegen.
Das sollte normalerweise ein ![]() Der Pfad wäre dann "..\assets\internal\" wenn ich es richtig sehe. Die Datei kann man dann wie beschrieben erreichen. Ich würde immer erstmal mit FileExists prüfen was wo da ist. |
AW: SQLite unter Android
Danke für Deine Hilfe !!!
Das hat an der Resource gelegen denke ich. Ich habe jetzt eine Verbindung und bekomme auch etwas aus der Tabelle gelesen. Lg Mirko |
AW: SQLite unter Android
Ich wollte nicht noch ein neues Thema starten weil es im Prinzip noch um die gleiche Sache geht.
Die Verbindung zu SQLite funktioniert jetzt einwandfrei mit Unidac. Ich verwende aktuell beim onClick Event eines Buttons:
Code:
Wenn ich das gleiche nun im onCreate des Formulars mache blockiert die App.UniConnection1.Database := TPath.Combine(TPath.GetDocumentsPath, 'testdb.sqlite'); if UniConnection1.Connected = false then UniConnection1.Connect; Weil jemand woran das liegt? LG Mirko |
AW: SQLite unter Android
Verwende ein DataModule, welches dann als erstes erzeugt wird.
|
AW: SQLite unter Android
Zitat:
Ich lege mir teilweise diese Operationen zeitversetzt in Funktionen nach OnShow, damit schonmal die App startet, und eventuelle Datenoperationen können im Hintergrund, später erfolgen. Ach ja, der Tipp mit DatenModulen bleibt davon natürlich unberührt, da gilt das Gleiche. |
AW: SQLite unter Android
Super onShow funktioniert es mit UniConnection1.Connect;
Wenn ich allerdings danach einen SELECT mache ist schon wieder Ende, die App blockt.
Code:
Wieso macht er den Connect aber die Abfrage schafft er dann nicht mehr?
if UniConnection1.Connected then
begin UniQuery1.Close; UniQuery1.SQL.Text := 'SELECT * from testtable'; UniQuery1.Execute; while not UniQuery1.EOF do begin TMSFMXGrid1.RowCount := TMSFMXGrid1.RowCount + 1; TMSFMXGrid1.Cells[0,TMSFMXGrid1.RowCount-1] := UniQuery1.FieldByName('test1').AsString; TMSFMXGrid1.Cells[1,TMSFMXGrid1.RowCount-1] := UniQuery1.FieldByName('test2').AsString; UniQuery1.Next(); end; end; Rollo Du schreibst Du legst Dir die Aktionen zeitversetzt. Machst Du das mit Timern? LG Mirko |
AW: SQLite unter Android
Ich arbeite jetzt weder mit UniDacx, noch mit TMS, aber es müsste so etwas in der Art wie unten dort geben um das UI-Update beim Zeicnen zu verhindern, so das erst nach dem ganzen Update der Screen upgedatet wird.
Das s.u. könnte das Problem erklären wenn Du schon sehr viele Datensätze in der DB hast. Zitat:
Wenn die DB noch leer ist würde ich erstmal debuggen bis zu welcher Stelle Du kommst, um festzustellen was genau jetzt nicht geht. Zitat:
Mit dieser Klasse kann ich eine anonyme Prozedur aufrufen, die dann mit einem Delay aufgerufen wird um Timings zu erzeugen. Im Prinzip gibt es für solche Zwecke auch den ![]() Trat immer nur selten und sporadisch auf, musste aber deswegen von dem IdleWorker wieder Abstand nehmen. Eigentlich sollte der TIdleWorker aber super funktionieren, ich habe ihn nur danach nicht mehr getestet (guter Hinweis das ich mir das nochmal auf die ToDo Liste schreibe :stupid:). |
AW: SQLite unter Android
Hallo,
Zitat:
|
AW: SQLite unter Android
Zitat:
|
AW: SQLite unter Android
Ist das Open - Close eventuell für Android spezifisch?
Denn wenn ich etwas für die Windows Plattform mache bekomme ich eine Ergebnismenge mit Execute. LG Mirko |
AW: SQLite unter Android
Zitat:
Bei DataSet[I].Open wird ein Curor geöffnet, durch den man clienseitig navigieren kann. Dies ist weder datenbank- noch OS-spezifisch. |
AW: SQLite unter Android
Hmm..
Das hat mit Android nichts zu tun.. Datenbank SQL-Komponenten (von TDataSet abgeleitet) verwenden in der Regel folgendes: - Execute -> Für Insert/Update -> Es kommt nur eine Rückmeldung über die Anzahl der geänderten Datensätze - Open/Close -> Für Select -> Es wird eine Datenmenge (Records) zurück geliefert, bzw. (Close) wieder geschlossen. Dies sollte bei allen TDataSets so funktionieren. Wenn UniDac bei Execute eine Datenmenge liefert, dann dürfte dies UniDac Spezifisch sein.. |
AW: SQLite unter Android
Nein, Open - Close oder Active True - False ist das Standardverhalten.
Was Unidac mit Execute macht kann ich nicht sagen, es solte obiges aber korrekt implementieren für alle Platformen. Das kommt aus dem TDataSet. |
AW: SQLite unter Android
Es ist immer klug, die
![]() Zitat:
Delphi-Quellcode:
genauso gut wie ein
Execute
Delphi-Quellcode:
sein.
Open
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz