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类型存储在数据库中。除了内存限制外,您可以存储的大小没有实际限制。
注意:本文由hieroly翻译于2024年04月26日
发表评论