这里有几个选项供您考虑:
1)刚刚获得的所有数据
30-40千行是没有那么多的内存来存放于大多数应用。即使您需要多次休息呼叫以获取数据,您也可以预先完成。如果你总是在所有的数据将循环的时间是一样的,如果你得到它前面或内循环:
repeat
PartialData := genericREST_Get(baseURL, resource, suffix);
// CopyDataSet is actually a FireDac method that I don't see on ClientDataSet
// Basically just .Append and copy all fields with matching names.
FullDataMemTable.CopyDataSet(PartialData);
until PartialData.IsEmpty;
2)如果你只希望有一组数据在一个时间你可以将DataSet包装在另一个重复一些调用的对象中(Eof,FieldByName,Next等)。当“Next”碰到eof时,你试着获取更多的数据。这里的例子是一个独立的类,但你也可以在你的DataModule上创建这些公共方法。然后,而不是类似dm1.ds_Generic.DataSet.Next,你只需调用dm1.Next。
constructor TDataFetcher.Create(BaseUrl, Resource, Suffix: string);
begin
FBaseUrl := BaseUrl;
FResource := Resource;
FSuffix := Suffix;
end;
procedure TDataFetcher.Open;
begin
FData := genericREST_Get(FBaseURL, FResource, FSuffix);
end;
procedure TDataFetcher.GetNextData;
begin
FData := genericREST_Get(FBaseURL, FResource, FSuffix);
end;
function TDataFetcher.Eof: boolean;
begin
result := FData.Eof;
end;
function TDataFetcher.FieldByName(FieldName: string): TField;
begin
result := FData.FieldByName(FieldName);
end;
procedure TDataFetcher.Next;
begin
FData.Next;
if FData.Eof then
begin
GetNextData;
end;
end;
其他选项:
一)继承的TClientdataSet 您还可以通过获得来自的TClientdataSet和压倒一切的MoveBy一个新的类实现这一点:
function MoveBy(Distance: Integer): Integer; virtual;
如果继承MoveBy设置EOF然后你可以加载下一组数据。但是,如果您尝试此操作,请确保考虑所有用例。例如,如果调用者使用.Last,你想要发生什么?这是包装类所具有的一个优点。除了你公开的内容外,调用者不能做任何事情。
function TMyDataSet.MoveBy(Distance: Integer): Integer; override;
begin
inherited MoveBy
if self.Eof then
begin
FetchMoreData;
end;
end;
B)FetchOnDemand
的ClientDataSet已经内置支持FetchOnDemand。我不知道如何与RestDataAdapter交互。我确信给予足够的工作可以让一个提供者返回一个总记录数,然后让ClientDataSet根据需要请求更多的记录。