2011-09-23 10 views
0

データベースに保存されているフォルダのリストを取得して、それらを正しい階層のローカルマシンに作成するクラスを作成する必要があります。フォルダのIDと親のIDからJavaでフォルダを作成する

フォルダがそうのようなデータベース上に配置されている:

 
id name parent_id 

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

だから、文書、映画、ビデオ、デスクトップがルートです。 'my files'はidが1(documents)のフォルダにあり、 'other'は4のid(myファイル)のフォルダに格納されます

私は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オブジェクトを作成し、データベースから読み取るときにこれらのオブジェクトを構築します。すべてのFolderオブジェクトを作成したら、最後のループを実行して各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); 

使用整数。 valueOf(String)Stringをintに変換します。

あなたはすべてのフォルダを作成したら、あなたはこのように、子どもに親フォルダを接続するための1つの最終ループを作ることができます。

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

最後に、単にIDが0のフォルダを取得し、構築を開始ツリー上を移動する便利な方法としてfolder.getChildren()を使用して、ファイルをディスクに保存します。 Fileオブジェクトのjavadocをチェックすると、特にmkdirs()メソッドを使いたいと思うでしょう。

希望に役立ちます。

+0

これは "data.put(newFolder.getId()、newFolder);"を除いて、私にとって素晴らしいことです。私は得る: "型の不一致:要素型整数からフォルダに変換できません"とeclipseは、 "フォルダ"をintergerに変換したい。私が間違っていたことは何ですか? – WookooUK

+0

マップジェネリックタイプが間違っていました。これを反映するためにマップを作成するためのコードを編集しました。これはMap data = new HashMap ();でなければなりません。 –

+0

最後の部分については、id = 0のフォルダをグラッピングする方法を教えてください。私はまた、コードをどこに置くかわからない、現在では、すべてのPIDループ – WookooUK

1

あなたがデータベースからすべての値を得れば、私は(フォルダのID、名前、および親IDを保持している)そのフォルダの情報に各フォルダIDをマップMap<Integer,Folder>を作成することをお勧め。このマップをループすることができます。そして、各フォルダについて、ルートに到達するまで親のIDを再帰してフルパスを構築します(例えば "foo/bar/baz")。そしてFile.mkdirs()をこのパス。

+0

私はJavaに慣れていて、フローをスタックしていますが、非常に勉強に興奮しています。いくつかの基本的なJavaアプリケーションといくつかのアンドロイドアプリケーションをビルドしましたが、これは少し先進的です。私はマッピングと再帰的ループがどのように機能するのかはよく分かりませんが、私に例を教えてください。 – WookooUK

+0

@ user961574ありがとうございます - このサイトのヘルプを得るには、ターゲットとなる質問が投稿されています。 「このコードを書くにはどうすればいいの?代わりに、私はそれに亀裂を取り、あなたが作成したものを掲示し、何がうまくいかないのかという質問をすることをお勧めします。 googleingときだけそれを見つけ、私は前に質問をするためにこのサイトを使用していない、 – jtahlborn

+0

ありがとう(新しいコードを追加するためにあなたの質問を編集することができます)、通常私はこのサイトを指す結果に必要な修正を見つけます。私はコードの新しいリビジョンを書き留めて、運がなければ再び投稿します。 Thanks again – WookooUK

0

9月29日にあなたのコメントを参照して、フォルダの印刷について質問します。あなたのコードは親フォルダの名前だけを印刷していることを除いて、okと思われます。

... 
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); 
} 
を、あなたは彼らにあなたが子供を掘り下げると、おそらく、あまりにもそれらを印刷このような何かをするために必要なすべてを印刷したい場合

希望するものがあります。

関連する問題