2017-07-10 156 views
0

我一直的文件路徑列表中ArrayList<String>這樣的:保存文件系統從路徑列表到SQL數據庫

/a/b/file1 
/a/b/file2 
/a/b/file3 
/a/b/file4 
/b/d/file5 
/e/c/file6 

然後,我將它們映射到POJO是這樣的:

public class FileData { 
    public String id; 
    public String name; 
    public String path; 

    // store parent of this file or folder. If value is null, mean file/folder in root 
    public String parentId; 

    public boolean isFolder; 
    } 

這裏是因爲它的數據庫模式:

FileData 

id | name | path | parent_id | is_folder 
1 | file1| /b | 2  | false 
2 | b | /a | 3  | true 
3 | a |/ | null | true 

我不知道有沒有什麼快速的方法解析ArrayList<String>以上爲ArrayList<FileData>其中有孩子 - 父母關係,那我可以保存到數據庫中嗎?

+0

您是否聽說過使用ORM工具(如Hibernate)?順便說一下,我不會關注你的輸出表。 –

+0

它也可以在數據庫端完成。你正在使用哪個DBMS。 –

+0

@TimBiegeleisen我只是更新我的問題來說清楚。問題是我需要將列表文件路徑解析到具有子 - 父關係的'FileData'對象列表中。我可以自己將這個列表保存到數據庫中 – R4j

回答

1

下面是創建ArrayList()的程序的實現,以便您能夠存儲在數據庫中。

import java.io.*; 
import java.util.*; 

class Main { 

    public static class FileData { 
    public String id; 
    public String name; 
    public String path; 

    // store parent of this file or folder. If value is null, mean file/folder in root 
    public String parentId; 

    public boolean isFolder; 
    } 

    public static void main(String[] args) { 
    ArrayList<String> filePaths = new ArrayList<String>(); 

    // inserting some dummy values 
    filePaths.add("https://stackoverflow.com/a/b/file1"); 
    filePaths.add("https://stackoverflow.com/a/b/file2"); 
    filePaths.add("https://stackoverflow.com/a/b/file3"); 
    filePaths.add("https://stackoverflow.com/a/b/file3"); 
    filePaths.add("https://stackoverflow.com/a/b/file4"); 
    filePaths.add("/b/d/file5"); 
    filePaths.add("/e/c/file6"); 

    HashMap<String, Integer> pathId = new HashMap<>(); 

    HashMap<String, Integer> mCheck = new HashMap<>(); 

    ArrayList<FileData> fileDataSql = new ArrayList<>(); 

    int cntId = 1; 

    for(String s:filePaths) { 
     String[] sSplit = s.split("/"); 
     for(int i=1; i<sSplit.length; i++) { 
     if(!pathId.containsKey(sSplit[i])) { 
      pathId.put(sSplit[i], cntId); 
      cntId++; 
     } 
     FileData fileDataObj = new FileData(); 
     fileDataObj.id = Integer.toString(pathId.get(sSplit[i])); 
     fileDataObj.name = sSplit[i]; 

     // Here I am checking if this is the first element or not, if yes then it has null parentId and/as path 
     if(i == 1) { 
      fileDataObj.parentId = "null"; 
      fileDataObj.path = "/"; 
     } else { 
      fileDataObj.parentId = Integer.toString(pathId.get(sSplit[i-1])); 
      fileDataObj.path = "/" + sSplit[i-1]; 
     } 

     if(i == sSplit.length-1) { 
      fileDataObj.isFolder = false; 
     } else { 
      fileDataObj.isFolder = true; 
     } 
     if(!mCheck.containsKey(sSplit[i])) { 
      mCheck.put(sSplit[i], 1); 
      fileDataSql.add(fileDataObj); 
     } 
     } 
    } 

    for(FileData obj : fileDataSql) { 
     System.out.println(obj.id + " " + obj.name + " " + obj.path + " " + obj.parentId + " " + obj.isFolder); 
    } 
    } 
} 

我可能使用了很多空間,但它可以滿足您的需求。

希望這會有所幫助!

+0

謝謝,我更新了一下你的代碼,它有效。我只是想遞歸解決這個問題,以及 – R4j

+0

啊,很高興它幫助:) – zenwraight

相關問題