У меня нет проблем с созданием базы данных и таблицы, но у меня много проблем с удалением БД.
Поскольку я не знаю, где допустил ошибку, публикую полный тестовый код.
Основная форма:
Код: Выделить всё
unit Form_Main;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, MobilePermissions.Model.Signature,
MobilePermissions.Model.Dangerous, MobilePermissions.Model.Standard,
MobilePermissions.Component;
type
TForm1 = class(TForm)
MP1: TMobilePermissions;
Button1: TButton;
btn2: TButton;
btn1: TButton;
procedure Button1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Module_DataBase;
{$R *.fmx}
procedure TForm1.btn1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
EraseDB;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreaDb;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MP1.Apply; // Apply the permissions
end;
end
Код: Выделить всё
unit Module_DataBase;
interface
uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
System.IOUtils,
FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.FMXUI.Wait,
Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Param, FireDAC.DatS,
FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Phys.IB,
FireDAC.Phys.IBDef, FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef,
FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLiteWrapper.Stat;
type
TDM = class(TDataModule)
Con1: TFDConnection;
FQR1: TFDQuery;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DM: TDM;
DBPath : string;
procedure CreaDB;
Procedure EraseDB;
implementation
{%CLASSGROUP 'FMX.Controls.TControl'}
{$R *.dfm}
procedure CreaDB;
var Tables : TStringList;
SqlStr : string;
MS : TMemoryStream;
I : Integer;
begin
DBPath := TPath.GetDocumentsPath+PathDelim +'interbase' + PathDelim + 'TestDB.ib';
DM.Con1.Params.Values['Database'] := DBPath;
DM.Con1.Params.Values['CreateDatabase'] := BoolToStr(not FileExists(DBPath),True);
DM.Con1.Open;
Tables := TStringList.Create;
DM.Con1.GetTableNames('','','',Tables); // Get Tables
// Check for Test table ...
if Tables.Count=0 then
begin
SqlStr:='CREATE TABLE TabellaTest (';
SqlStr:=SqlStr + 'Id INTEGER NOT NULL PRIMARY KEY,';
SqlStr:=SqlStr + 'Articolo CHAR(40),';
SqlStr:=SqlStr + 'Prezzo FLOAT(2)';
SqlStr:=SqlStr + ')';
DM.FQR1.SQL.Clear;
DM.FQR1.SQL.Add(SqlStr);
DM.FQR1.ExecSQL;
DM.Con1.GetTableNames('','','',Tables);
end
else
begin
// Just to check the tablename
For I:=0 To Tables.Count - 1 do
SqlStr:=Tables[i];
end;
FreeAndNil(Tables);
end;
procedure EraseDB;
begin
if not FileExists(DBPath) then
Exit;
DM.Con1.Connected:=False;
DM.FQR1.SQL.Clear;
//DM.FQR1.SQL.Add('DROP SCHEMA ' + DBPath); // * 1
DM.FQR1.SQL.Add('DROP DATABASE ' + 'TestDB.ib'); // * 2
DM.FQR1.ExecSQL;
end;
end.
Код: Выделить всё
Con1.DriverName := IB
Вы можете установить его через Delphi IDE GetIt или по адресу
https://github. .com/adrianosantostreina/MobilePermissions
и разрешения: ReadingExternalStorage, WriteExternalStorage.
Если я попытаюсь удалить БД, я получаю эти ошибки (случайно, если Я раскомментирую строку *1 или *2):
Ошибка 1:
Проект DB_TEST.apk вызвал класс исключения EIBNativeException с сообщением «[FireDAC][Phys][IB]Ошибка динамического SQL
Код ошибки SQL = -104
Токен неизвестен — строка 1, символ 6
БАЗА ДАННЫХ».
Ошибка 2:
Я больше не могу воспроизвести эту ошибку, но это всегда исключение EIBNativeException: «TestDB.ib» существует.
Ошибка 2:
Я больше не могу воспроизводить эту ошибку, но это всегда исключение EIBNativeException: существует «TestDB.ib».
Ошибка 2:
Я больше не могу воспроизводить эту ошибку, но это всегда исключение EIBNativeException: существует «TestDB.ib».
Ошибка 2:
Я больше не могу воспроизводить эту ошибку, но это всегда исключение EIBNativeException: существует «TestDB.ib». p>
Одинаковое поведение в Delphi версии 11.3 и 12.2
Что я делаю не так?
Подробнее здесь: https://stackoverflow.com/questions/790 ... at-runtime