复制树并设置新的数据库ID

时间:2011-03-26 22:13:30

标签: delphi

我正在尝试复制一棵树。树被保存在SQLite数据库中,我将其加载到树视图中。表结构如下:id,parent,level,position。在树视图中,id被赋予节点对象。现在我想复制树递归。有必要生成新的id并设置父id的正确:

procedure copyTree(machineId, parent : integer; startNode : TTreeNode);
var
  tmpId : integer;
  tmpData : TAssignmentData; // Record
begin
  if assigned(startNode) then
  begin
    //Read out data from existing node
    tmpData := data.getAssignment(integer(startnode.Data));
    //Set node data to new machine
    tmpData.machine := machineId;
    //If node is on the top level
    if tmpData.parent <> 0 then
      tmpData.parent := parent;
    //Write dataset (new node) to the database
    tmpId := data.insertAssignment(tmpData);

    copyTree(machineId, tmpId, startnode.getFirstChild);
    copyTree(machineId, tmpId, startnode.getNextSibling);
  end;
end;

我已尝试过此代码,但在数据库中未正确设置父ID。作业丢失了。我的错误在哪里?

最好的问候......

1 个答案:

答案 0 :(得分:1)

假设data.insertAssignment(tmpData);返回节点的新id,则只有该节点的子节点的父ID应设置为tmpId。你也将下一个兄弟姐妹的parentid设置为tmpId!

copyTree(machineId, tmpId, startnode.getNextSibling);

考虑只传递兄弟节点的父节点:

copyTree(machineId, parent, startnode.getNextSibling);