Создание папок из идентификатора папки и родительского идентификатора в Java - PullRequest
1 голос
/ 23 сентября 2011

Мне нужно создать класс, который получит список папок, хранящихся в базе данных, и создаст их на локальном компьютере в правильной иерархии.

Папки расположены в базе данных следующим образом:

id name parent_id

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

Так что документы, фильмы, видео и рабочий стол находятся в корне.«мои файлы» помещаются в папку с идентификатором 1 (документы), а «другие» - в папку с идентификатором 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());
             }
            }

Ответы [ 3 ]

2 голосов
/ 23 сентября 2011

Создайте объект 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);
}

Наконец, просто возьмите папку с идентификатором 0 и начните создавать свои файлы на диске, используя folder.getChildren () как удобный способ перемещения вниз по дереву. Проверьте javadoc на объекте File, вам особенно нужно использовать метод mkdirs ().

Надеюсь, это поможет.

1 голос
/ 23 сентября 2011

как только вы получите все значения из базы данных, я бы предложил создать Map<Integer,Folder>, который сопоставляет каждый идентификатор папки с информацией о ее папке (где папка содержит идентификатор, имя и идентификатор родителя).затем вы можете пройти по этой карте, и для каждой папки создать полный путь, повторяя родительские идентификаторы, пока не дойдете до корня и (например, «foo / bar / baz»), а затем вызвать File.mkdirs () сэтот путь.

0 голосов
/ 08 октября 2011

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);
}

надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...