我需要创建一个类来获取存储在数据库中的文件夹列表,并在本地计算机上以正确的层次结构创建它们。
文件夹按如下方式安排在数据库中:
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(文件)的文件夹,'other'进入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());
}
}
答案 0 :(得分: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);
使用Integer.valueOf(String)将String转换为int。
创建完所有文件夹后,您可以进行最后一个循环以将父文件夹连接到子文件夹,如下所示:
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()方法。
希望有所帮助。
答案 1 :(得分:1)
一旦从数据库中获取了所有值,我建议创建一个Map<Integer,Folder>
,将每个文件夹ID映射到其文件夹信息(其中Folder包含id,name和parent id)。然后,你可以循环遍历这个地图,并为每个文件夹建立完整的路径,通过递归父ID直到你到达根和(例如“foo / bar / baz”),然后调用File.mkdirs()这条路。
答案 2 :(得分: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);
}
希望有所帮助。