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

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

Сообщение Anonymous »

Я переписываю старое приложение для Android, и в качестве новой функции мне нужно добавить небольшую базу данных всего с одной таблицей.
У меня нет проблем с созданием базы данных и таблицы, но у меня много проблем с удалением БД.
Поскольку я не знаю, где допустил ошибку, публикую полный тестовый код.
Основная форма:

Код: Выделить всё

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/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
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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