這裏有幾個選項供您考慮:
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根據需要請求更多的記錄。