在文件夹中创建子文件夹

问题描述 投票:0回答:1

我正在开发一个 Android 文件管理应用程序,用户可以在其中上传、下载文件并将文件组织到文件夹中。目前,我已经实现了基本的文件和文件夹功能。现在,我想扩展应用程序以支持嵌套文件夹,允许用户在其他文件夹内创建文件夹。

我使用firebase数据库和java语言以及android studio


    public void createFolder() {
        // Create a Dialog object
        Dialog dialog = new Dialog(this);

        // Set the content view of the dialog by inflating folder_dialog.xml
        View dialogView = LayoutInflater.from(this).inflate(R.layout.folder_dialog, null);
        dialog.setContentView(dialogView);

        // Now, you can find and use the views inside the dialogView
        EditText folderNameEditText = dialogView.findViewById(R.id.FolderName);
        Button createFolderBtn = dialogView.findViewById(R.id.CreateFolderBtn);

        // Set click listener for the create folder button
        createFolderBtn.setOnClickListener(v -> {
            String folderName = folderNameEditText.getText().toString().trim();

            // Perform folder creation logic here
            if (!folderName.isEmpty()) {
                DatabaseReference foldersRef = FirebaseDatabase.getInstance().getReference().child("folders").child(currentUserId);

                // Generate a unique key for the folder
                String folderId = foldersRef.push().getKey();

                // Store folder metadata in the Realtime Database
                FolderMetadata folderMetadata = new FolderMetadata(folderId, folderName);

                // Save folder metadata using the unique key
                foldersRef.child(folderId).setValue(folderMetadata)
                        .addOnSuccessListener(aVoid -> {
                            // Folder created successfully
                            StyleableToast.makeText(FolderActivity.this, "Folder created successfully", Toast.LENGTH_SHORT, R.style.mytoast).show();
                            dialog.dismiss(); // Dismiss the dialog after creating the folder
                        })
                        .addOnFailureListener(e -> {
                            // Folder creation failed
                            StyleableToast.makeText(FolderActivity.this, "Folder creation failed", Toast.LENGTH_SHORT, R.style.mytoast).show();
                        });
            } else {
                folderNameEditText.setError("Please enter a folder name");
            }
        });

        // Show the dialog
        dialog.show();
    }

当我想在用户的主帐户(即根目录)中创建一个文件夹时,我编写了这些代码,但现在我不知道如何获取父文件夹ID,以便我可以在彼此内部创建文件夹.

一开始,我创建了一个名为FolderActivity的新类,以便我可以显示我创建的文件夹内的文件和文件夹。

我之前创建的 CreateFolder 方法是在 Home 类上,所以我创建了一个对象以便我可以使用它,但是当我按下“创建文件夹”按钮时,它会将我带出页面并带我到主页,所以我复制了创建文件夹方法并将其写入FolderActivity类中,现在当我按下创建文件夹按钮时。出现一个对话框,我可以在其中输入文件夹的名称。当我创建并写入文件夹名称时,它会将其保存在用户的主文件夹中,即根文件夹中,而不是我单击的文件夹中。

java android database firebase subdirectory
1个回答
0
投票

为了支持嵌套文件夹,您需要修改数据结构和逻辑来处理文件夹之间的父子关系。在您当前的实现中,您似乎将文件夹直接存储在用户的 ID 节点下。相反,您可以创建一个更具层次结构的结构来表示嵌套文件夹。

这是

createFolder
方法的修改版本以及支持嵌套文件夹的一些其他更改:

  1. 首先,修改数据结构以分层表示文件夹。例如:
// Instead of storing folders directly under the user's ID, represent a folder hierarchy
// For simplicity, I'm assuming a structure like "users" -> "userId" -> "folders" -> "folderId"
DatabaseReference foldersRef = FirebaseDatabase.getInstance().getReference()
    .child("users")
    .child(currentUserId)
    .child("folders");
  1. 现在,当在另一个文件夹中创建文件夹时,您需要将父文件夹 ID 传递给
    createFolder
    方法。修改方法签名以包含父文件夹 ID:
public void createFolder(String parentFolderId) {
    // ... existing code

    // Generate a unique key for the folder
    String folderId = foldersRef.push().getKey();

    // Store folder metadata in the Realtime Database
    FolderMetadata folderMetadata = new FolderMetadata(folderId, folderName);

    // Save folder metadata using the unique key
    foldersRef.child(folderId).setValue(folderMetadata)
        .addOnSuccessListener(aVoid -> {
            // Folder created successfully
            StyleableToast.makeText(FolderActivity.this, "Folder created successfully", Toast.LENGTH_SHORT, R.style.mytoast).show();
            dialog.dismiss(); // Dismiss the dialog after creating the folder
        })
        .addOnFailureListener(e -> {
            // Folder creation failed
            StyleableToast.makeText(FolderActivity.this, "Folder creation failed", Toast.LENGTH_SHORT, R.style.mytoast).show();
        });
}
  1. 在您的 UI 中或您调用的任何位置
    createFolder
    ,请确保传递父文件夹 ID:
// Example: When creating a folder inside another folder
String parentFolderId = "yourParentFolderId";
createFolder(parentFolderId);
  1. 在用户主帐户(根文件夹)内创建文件夹时,调用
    createFolder
    而不传递父文件夹 ID:
// Example: When creating a folder in the root (main) folder
createFolder(null);

这样,您可以在创建新文件夹时通过指定父文件夹ID来创建文件夹的层次结构。相应地调整文件夹列表逻辑,以根据父子关系显示嵌套文件夹。

© www.soinside.com 2019 - 2024. All rights reserved.