Ich nutze SQLite mit FMX auf Mobilen geräten.
Um die Oberfläche responsive zu halten muss ich oft Vorgänge in WorkerThreads auslagern. Ich lagere diese Arbeit in Anonyme threads aus und Zeige in der App einen Sperrbildschirm mit Aktivitäts-Anzeige(Kreisel) oder Fortschritsbalken oder Aktivitäts-Log an.
Sprich es passiert trotzdem alles sequentiel, aber die Oberfläche meldet nicht nach so Dinge wie "Anwendung reagiert nicht mehr, wollen Sie sie beenden?", wenn man auf den Sperrbildschirm tippt oder wischt und 500ms lang nicht drauf reagiert.
Die Programm logik stellt seit kurzem nicht mehr sicher das sequentiel auf die
DB zugegriffen wird.
Bevor ich diesen Teil der Logik jetzt Nachliefere habe ich mal folgende Einstellungen ausprobiert.
Delphi-Quellcode:
FDManager.Active := true;//Hier 6
FConnection := TFDConnection.Create(self);
PhysSQLiteDriverLink := TFDPhysSQLiteDriverLink.Create(self);
GUIxWaitCursor := TFDGUIxWaitCursor.Create(self);
GUIxAsyncExecuteDialog := TFDGUIxAsyncExecuteDialog.Create(Application.MainForm);
FConnection.Params.Values['DriverID'] := 'SQLite';
{$IFDEF ANDROID}
FConnection.Params.Values['Database'] := TPath.Combine(TPath.GetHomePath,
'APP.s3db');
{$ELSE}
{$IFDEF IOS}
FConnection.Params.Values['Database'] := TPath.Combine(TPath.GetDocumentsPath,
'APP.s3db');
{$ELSE}
FConnection.Params.Values['Database'] := TPath.Combine(TPath.GetHomePath,
'APP.s3db');
{$ENDIF}
{$ENDIF}
FConnection.Params.Values['Lockingmode'] := 'Normal'; //Hier 1
FConnection.Params.Values['Synchronous'] := 'Full'; //Hier 2
FConnection.Params.Values['SharedCache'] := 'False'; //Hier 3
FConnection.UpdateOptions.LockWait := true; //Hier 4
FConnection.UpdateOptions.LockMode := TFDLockMode.lmPessimistic;//Hier 5
FConnection.Params.Values['DateTimeFormat'] := 'String';
{$IFDEF IOSSIM}
FConnection.Params.Values['Password'] := '';
// im Apple SIM geht das nicht mit Password
{$ELSE}
FConnection.Params.Values['Password'] := 'MyPass';
// Ohne Passwort fragt er nach einem Passwort! Auch wenn es leer ist.
{$ENDIF}
PhysSQLiteDriverLink.DriverID := 'SQLite';
GUIxWaitCursor.Provider := 'FMX';
GUIxAsyncExecuteDialog.Provider := 'FMX';
Ich habe die Zeilen Hier 1 bis Hier 6 angepasst oder hinzuefügt.
Jetzt bekomme ich keine Fehler mehr wenn ein
Query mit locate auf die
DB zugreift und sich in einem anderen Thread befindet.
Sorgen diese Einstellungen bereits das Zugriffe aus mehreren Threads sequentiel abgearbeite werden.
Oder muss ich wirklich selber alle SQLITE
DB Zugriffe verriegeln? (Leider beherrscht SQLite nur eine einzige gleichzeitige Connection)