【问题标题】:Delete FireBase Value Without Knowing The Key Name在不知道键名的情况下删除 FireBase 值
【发布时间】:2021-08-11 11:34:45
【问题描述】:

所以我正在开发记忆 Firebase 应用程序,并且有一个阶段,用户可以将照片上传到他的记忆中。每张照片都有唯一的名称“ImgLink0”、“ImgLink1”等。

我正在处理的功能是在长按时删除特定照片,但我无法在 Firebase 中访问该图像。

我尝试如下,但因为无法识别图像密钥而卡住了:

mDatabase.child(userUID).child("Memories").child(memoryName).child("Images").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot imageSnapshot : dataSnapshot.getChildren()) {
            
            String imagesKey = imageSnapshot.getKey();
            String imagesValue = (String) imageSnapshot.getValue();

            Log.e("Test","" + imagesKey + "" + imagesValue);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

这是数据结构:

我也尝试过使用查询,但没有成功,因为我没有图像密钥。

感谢您的帮助:)

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    要从数据库中删除一个节点,您需要知道该节点的完整路径。

    假设您确实知道要删除的图像的 URL,但不知道存储在下面的键(ImgLink1ImgLink2),您将不得不使用查询查找那个键。

    类似:

    DatabaseReference ref = mDatabase.child(userUID).child("Memories").child(memoryName).child("Images");
    Query query = ref.orderByValue().equalTo("URL of the image")
    query..addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot imageSnapshot : dataSnapshot.getChildren()) {            
                imageSnapshot.getRef().removeValue();
            }
        }
        ...
    

    另请参阅这些相关答案:

    【讨论】:

    • 非常感谢弗兰克,工作完美。
    【解决方案2】:

    例如,要删除第二个 URL,请使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference imageToDeleteRef = rootRef
        .child(uid)
        .child("Memories")
        .child("TestMem")
        .child("Images")
        .child("ImgLink1");
    imageToDeleteRef.removeValue().addOnCompleteListener(/* ... */);
    

    所以我创建了一个完全指向ImgLink1 节点的引用,然后我在引用上调用.removeValue() 以删除它。所以不需要读取值来执行删除操作。

    如果您想阅读网址,请使用以下几行:

    imageToDeleteRef.addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DataSnapshot> task) {
            if (task.isSuccessful()) {
                String url1 = task.getResult().child("ImgLink1").getValue(String.class);
                Log.d("TAG", url1);
            } else {
                Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
            }
        }
    });
    

    logcat 中的结果将是:

    https://firebasestorage.googleapis.com...
    

    【讨论】:

    • 嗨,Alex,非常感谢,这行得通,但我想在不知道键名的情况下删除该值。再次感谢。
    猜你喜欢
    • 2023-03-10
    • 2015-01-23
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2021-01-05
    • 2013-08-06
    • 2012-02-18
    • 2017-09-16
    相关资源
    最近更新 更多