it编程 > 编程语言 > Delphi

mORMot 1.18 第13章 动态数组

166人参与 2024-05-12 Delphi

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日

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

mORMot 1.18 第18章 使用REST/JSON的客户端/服务器

05-12

mORMot 1.18 第12章 Blobs(大二进制对象)

05-12

mORMot 1.18 第19章 安全性

05-12

mORMot 1.18 第11章 JSON - JavaScript对象表示法

05-12

mORMot 1.18 第23章 使用纯SQL

05-12

mORMot 1.18 第10章 连接表

05-12

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论