mORMot 1.18 第13章 动态数组
mORMot 1.18 第13章 动态数组
众所周知,数组是非常有用的。但在现实生活中,情况是不可预测的,数组的元素数量或大小可能会随着时间的推移而增长。有些语言,如PHP,就使得动态数组的使用变得很简单。在使用mORMot的Delphi中,我们使用类和方法来提供这一功能。
首先,让我们声明一个典型的 TSQLRecord
:
TSQLRecordPeople = class(TSQLRecord)
private
fFirstname: RawUTF8;
published
property Firstname: RawUTF8 read fFirstname write fFirstname;
end;
现在,我们将使用Integer(整数)、Currency(货币)和一个Record(记录)类型的动态数组对其进行扩展:
TFV = packed record
Major, Minor, Release, Build: integer;
Main, Detailed: string;
end;
TFVs = array of TFV;
TSQLRecordPeopleArray = class(TSQLRecordPeople)
private
fInts: TIntegerDynArray;
fCurrency: TCurrencyDynArray;
fFileVersion: TFVs;
published
property UTF8: RawUTF8 read fUTF8 write fUTF8;
property Ints: TIntegerDynArray index 1 read fInts write fInts;
property Currency: TCurrencyDynArray index 2 read fCurrency write fCurrency;
property FileVersion: TFVs index 3 read fFileVersion write fFileVersion;
end;
以下是一个用于输出 TSQLRecordPeopleArray
内容的函数:
procedure dumpva(VA: TSQLRecordPeopleArray);
var
i: integer;
begin
writeln('-----------------------------');
writeln('Firstname : ', VA.Firstname);
write('Ints : ');
for i := Low(VA.Ints) to High(VA.Ints) do
write(' ', VA.Ints[i]);
writeln;
write('Currency : ');
for i := Low(VA.Currency) to High(VA.Currency) do
write(' ', VA.Currency[i]);
writeln;
writeln('FileVersion.Main : ');
for i := Low(VA.FileVersion) to High(VA.FileVersion) do
writeln(' [', i, ']: ', VA.FileVersion[i].Main);
end;
现在,让我们来看看动态数组的实际应用:
var
V1: TSQLRecordPeople;
VA: TSQLRecordPeopleArray;
FV: TFV;
j: integer;
f: currency;
s: RawUTF8;
begin
V1 := TSQLRecordPeople.Create;
V1.Firstname := StringToUTF8('Erick');
VA := TSQLRecordPeopleArray.Create;
VA.FillFrom(V1);
dumpva(VA);
// 输出结果
// -----------------------------
// Firstname : Erick
// Ints :
// Currency :
// FileVersion.Main :
// 也就是说,还没有设置扩展数据集
j := 1;
VA.DynArray('Ints').Add(j);
j := 5;
VA.DynArray('Ints').Add(j);
f := 3.14;
VA.DynArray('Currency').Add(f);
FV.Main := 'Yours';
VA.DynArray('FileVersion').Add(FV);
FV.Main := 'Vos';
VA.DynArray('FileVersion').Add(FV);
dumpva(VA);
// 输出结果
// -----------------------------
// Firstname : Erick
// Ints : 1 5
// Currency : 3.14000000000000E+0000
// FileVersion.Main :
// [0]: Yours
// [1]: Vos
end;
我们可以创建任何标量或记录类型的动态数组,包括RawUTF。
请注意,您必须首先将值分配给变量,因为mORMot使用变量的运行时类型信息(RTT)来了解数据的大小。因此,您不能使用以下方式:
VA.DynArray('Currency').Add(3.142);
mORMot将这些值以BLOB类型存储在数据库中。除了内存限制外,您可以存储的大小没有实际限制。