Создание/удаление (удаление) базы данных на Android с помощью Delphi 11.x–12.x во время выполненияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Создание/удаление (удаление) базы данных на Android с помощью Delphi 11.x–12.x во время выполнения

Сообщение Anonymous »

Переписывание старого приложения для Android, и в качестве новой функции мне нужно добавить небольшую базу данных только с одной таблицей.
Кажется, у меня нет проблем с созданием базы данных и таблицы, но у меня много проблем с удалением ( 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.

Con1.DriverName := IB
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'.
Ошибка 2:
Я больше не могу воспроизвести эту ошибку, но это всегда исключение EIBNativeException, сообщающее, что «TestDB.ib» существует.
Одинаковое поведение в версиях Delphi 11.3 и 12.2.
Я что-то не так, есть предложения?
PS : Существует ли какой-нибудь навигатор базы данных для Windows/Android?

Подробнее здесь: https://stackoverflow.com/questions/790 ... at-runtime
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»