Ich führe diesen Code noch vor dem Backup und Reorg der Sqlite Datenbank, beim start der App aus. Damit geht es.
Es befreit die Alte datenbank von dem Passwort und neue Datenbanken haben ja eh keins.
Delphi-Quellcode:
Function TDBHealth.CheckAndRemoveEncryption:Boolean;
Begin
Result := False;
TSync.DB_CS.Acquire;
try
var SQLiteSec := TFDSQLiteSecurity.Create(
nil);
try
SQLiteSec.Database := FDatabase;
SQLiteSec.Password := '
';
SQLiteSec.DriverLink := FPhysSQLiteDriverLink;
var EncryptionStatus := SQliteSec.CheckEncryption;
if EncryptionStatus = '
<unencrypted>'
then
Begin
Result := true;
TLog.d('
TDBHealth.CheckAndRemoveEncryption: DB is unencrypted');
End
else if EncryptionStatus = '
<encrypted>'
then
Begin
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Encrypted DB or corrupt file');
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Check old DB-password start');
SQLiteSec.Database := FDatabase;
SQLiteSec.Password := TDBConstants.DBPASSWORD_OLD;
EncryptionStatus := SQLiteSec.CheckEncryption;
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Check old DB-password finish');
if (EncryptionStatus <> '
<unencrypted>')
and
(EncryptionStatus <> '
<encrypted>')
and
(EncryptionStatus <> '
')
then
Begin
TLog.d('
TDBHealth.CheckAndRemoveEncryption: DB is encrypted with old DB-password');
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Decrypt DB start');
try
SQLiteSec.Database := FDatabase;
SQLiteSec.Password := TDBConstants.DBPASSWORD_OLD;
SQLiteSec.RemovePassword;
Result := True;
Except
On E:
Exception do
Begin
fCheckDBhealthError := '
Beim entschlüsseln der Datenbank ist folgender Fehler aufgetretetn:' +
sLinebreak + e.
message + slinebreak+
'
Die Datenbank ist vermutlich defekt.' ;
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Decrypt DB Error:' + e.
message);
End;
end;
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Decrypt DB finish');
End
else
Begin
//Fehler;
fCheckDBhealthError := '
Beim Login in die SQLite Datenbank ist folgender Fehler aufgetretetn:' +
sLinebreak + EncryptionStatus + slinebreak+
'
Die Datenbank ist vermutlich defekt.' ;
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Error checking for encryption with old password returned:'+EncryptionStatus);
End;
End
else if EncryptionStatus = '
'
then
Begin
//Fehler;// Sollte man es dann nochmal mit passwort versuchen?
fCheckDBhealthError := '
Unknown error checking for unencrypted access. The DB is probably corrupt.';
TLog.d('
TDBHealth.CheckAndRemoveEncryption: Unknown error checking for unencrypted access. The DB is probably corrupt.');
End;
finally
SQLiteSec.Free;
end;
finally
TSync.DB_CS.Release;
end;
End;