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类型存储在数据库中。除了内存限制外,您可以存储的大小没有实际限制。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |