2011-09-23 3 views
0

데이터베이스에 저장된 폴더 목록을 가져와 올바른 계층 구조의 로컬 시스템에 생성하는 클래스를 만들어야합니다.폴더 아이디와 부모 아이디 (Java)로 폴더를 만듭니다.

폴더는과 같이 데이터베이스에 배치됩니다

 
id name parent_id 

1 documents 0 
2 movies 0 
3 videos 0 
4 my files 1 
5 desktop 0 
6 other 4 

그래서 문서, 영화, 비디오 및 데스크탑 루트에 있습니다. '내 파일'은 ID가 1 (문서) 인 폴더에 있고 '기타'는 ID가 4 인 폴더에 있습니다 (내 파일)

나는 whyle 루프를 사용하여이를 시도했지만 그 (것)들을 정확한 폴더로 들어가는 방법을 모릅니다.

try { 
      con = DriverManager.getConnection(url, user, password); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     while(i < 50) 
     { 
      try {    

      Statement st = con.createStatement(); 
      ResultSet result = st.executeQuery("SELECT name, id, parent_id FROM categories WHERE parent_id = '"+PID+"' AND repository_id = '"+RepoID+"'"); 



      while (result.next()) 
      { 
       String FolderName = result.getString ("name"); 
       String FolderId = result.getString ("id"); 
       String FolderId = result.getString ("parent_id"); 
make the folder name here 
       System.out.println(FolderName+" "+FolderId); 
      } 

      System.out.println(" "); 
        i++ ; 
      PID++; 
      } catch (SQLException ex) { 
       System.out.println(ex.getMessage()); 
      } 
      } 

답변

2

데이터를 저장할 Folder 개체를 만든 다음 데이터베이스에서 읽을 때이 개체를 빌드하십시오. 모든 폴더 개체를 작성한 후에는 최종 루프를 실행하여 각 폴더를 부모 클래스에 바인딩하십시오. 이 같은 아마 뭔가 : 지금 당신은 데이터베이스에서 데이터를 읽을 때

class Folder { 
    private String name; 
    private int id; 
    private int parentId; 
    private List<Folder> children = new ArrayList<Folder>(); 

    public Folder(String name, int id, int parentId) { 
     this.name = name; 
     this.id = id; 
     this.parentId = parentId; 
    } 

    public void addChildFolder(Folder folder) { 
     this.children.add(folder); 
    } 

    public List<Folder> getChildren() { 
     return Collections.unmodifiableList(children); 
    } 

    public int getParentFolderId() { 
     parentId; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getId() { 
     return id; 
    } 
} 

, 당신은 (자녀가없는)이 폴더의 개체를 만들고으로지도에 추가 :

Map<Integer, Folder> data = new HashMap<Integer, Folder>(); 

... loop through your result set getting folder data... 
Folder newFolder = new Folder(nameString, id, parentId); 
data.put(newFolder.getId(), newFolder); 

사용 정수. String를 int로 변환하는 valueOf (String) 당신이 만든 모든 폴더가 있으면

,이 같은 아이들에게 부모 폴더를 연결 한 마지막 루프를 만들 수 있습니다

for(Folder folder : data.values()) { 
    int parentId = folder.getParentFolderId(); 
    Folder parentFolder = data.get(parentId); 
    if(parentFolder != null) 
     parentFolder.addChildFolder(folder); 
} 

마지막으로, 단지 ID를 0으로 폴더를 잡고 건물을 시작합니다 파일을 디스크에 저장하고, tree.getChildren()을 사용하여 트리 아래로 이동할 수 있습니다. File 객체의 javadoc을 확인하십시오. 특히 mkdirs() 메서드를 사용하려고합니다.

희망이 있습니다.

+0

"data.put (newFolder.getId(), newFolder);"를 제외하고이 모든 것이 저에게 유용합니다. 나는 얻는다 : "유형 불일치 : 요소 유형 정수에서 폴더로 변환 할 수 없다."eclipse는 '폴더'를 interger로 변환하려고한다. 내가 뭘 잘못했는지 알아? – WookooUK

+0

지도 제네릭 형식이 잘못되었습니다.이를 반영하기 위해지도를 만들기위한 코드를 편집했습니다. Map data = new HashMap ();이어야합니다. –

+0

id = 0 인 폴더를 grapping하는 마지막 부분에 대해 어떻게 할 수 있습니까? 또한 코드를 어디에 넣어야할지 모르겠다. 현재는 모두 pid 루프 안에있다. – WookooUK

1

데이터베이스에서 모든 값을 일단, 내가 (폴더는 ID, 이름, 부모 ID를 보유)의 폴더 정보를 각 폴더 ID를 매핑하는 Map<Integer,Folder>을 만드는 건의 할 것. 그런 다음이 맵을 반복 할 수 있고 각 폴더에 대해 루트 및 (예 : "foo/bar/baz") 도달 할 때까지 부모 ID를 반복하여 전체 경로를 구축 한 다음 File.mkdirs()를 호출하여 이 길.

+0

내 질문을 수정 해 주셔서 감사합니다. 저는 매우 Java에 익숙하며, 플로우를 넘어서서 스택을 배우지 만 매우 익숙합니다. 몇 가지 기본 Java 응용 프로그램과 일부 안드로이드 응용 프로그램을 빌드했습니다. 그러나 이것은 나에게 조금 앞선 것입니다. 맵핑과 재귀 루프가 어떻게 작동하는지 잘 모르겠다. 예제를 보여 줄 수 있습니까? 감사합니다. – WookooUK

+0

@ user961574 -이 사이트에 대한 도움말을 얻는 가장 좋은 방법은 게시물 타겟 질문입니다. "이 코드를 작성하는 방법"은 매우 목표가 아닙니다.대신, 나는 그것에 균열을 가지고 제안하고 당신이 무엇을 만들고 작동하지 않는지에 대해 질문을 게시하는 것이 좋습니다거야. (새 코드를 추가하기 위해 질문을 편집 할 수 있습니다.) – jtahlborn

+0

전에이 질문에 대한 질문에이 사이트를 사용하지 않았으며, google을 찾을 때만이 사이트를 가리키는 결과에 대한 해결책을 찾았습니다. 운이 없다면 코드의 새 개정판을 작성하고 다시 게시 할 것입니다. 고마워요. – WookooUK

0

9 월 29 일에 귀하의 의견은 인쇄 폴더를 묻는 메시지를 참조하십시오. 부모 폴더의 이름 만 인쇄한다는 점을 제외하고는 코드가 괜찮은 것 같습니다. 당신이 그 (것)들에게 인쇄하려면 모든 당신은 그들도 아이들로 파고 인쇄하려면이 같은 아마 뭔가가 필요합니다

... 
for (Folder folder : data.values()) { 
    int parentId = folder.getParentFolderId(); 
    Folder parentFolder = data.get(parentId); 
    if (parentFolder != null) 
     parentFolder.addChildFolder(folder); 
} 

printFolderRecursively(data.get(1)); 

을 한 후이 어린이와 함께 폴더 이름을 인쇄하는 방법을 쓰기 :

public void printFolderRecursively(Folder folder) { 
    System.out.print("/" + rootFolderName); 
    for(Folder child : folder.getChildren()) 
     printFolderRecursively(child); 
} 

희망이 있습니다.