Кажется, у меня нет проблем с созданием базы данных и таблицы, но у меня много проблем с удалением ( drop) базу данных.
Поскольку я не знаю, где и почему я допустил ошибку, вот полный тестовый код.
Основная форма:
Код: Выделить всё
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.
TMobilepermission
Получить с помощью Delphi ide GetIt или
https://github.com/adrianosantostreina/ ... ermissions
и установлены следующие разрешения: ReadingExternalStorage, WriteExternalStorage
Если я попробуйте удалить БД, я получаю такое поведение (случайно, если я раскомментирую строку *1 или *2):
Ошибка 1:
Код: Выделить всё
Project DB_TEST.apk raised exception class EIBNativeException with message '[FireDAC][Phys][IB]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 6
DATABASE'.
Я больше не могу воспроизвести эту ошибку, но это всегда исключение EIBNativeException, сообщающее, что «TestDB.ib» существует.
Одинаковое поведение в версиях Delphi 11.3 и 12.2.
Я что-то не так, есть предложения?
PS : Существует ли какой-нибудь навигатор базы данных для Windows/Android?
Подробнее здесь: https://stackoverflow.com/questions/790 ... at-runtime
Мобильная версия