mORMot 1.18 第13章 动态数组

打印 上一主题 下一主题

主题 847|帖子 847|积分 2541

mORMot 1.18 第13章 动态数组

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表