Firebase OrderbyChild Query返回父键

时间:2017-12-01 06:51:42

标签: java android firebase firebase-realtime-database

我遇到问题,使用orderByChild().equalTo()方法检索并删除Firebase数据库中正确的节点级别。

在网上搜索了很长一段时间,并没有真正解决我的问题。请帮忙。

我的数据库结构:

enter image description here

我的Firebase添加和删除照片的方法

private void addPhotoToDatabase(String url){
    Log.d(TAG, "addPhotoToDatabase: adding photo to database");

    String newPhotoKey = myRef.child(mContext.getString(R.string.dbname_user_photos)).push().getKey();
    Photo photo = new Photo();
    photo.setDate_created(getTimeStamped());
    photo.setImage_path(url);
    photo.setUser_id(FirebaseAuth.getInstance().getCurrentUser().getUid());
    photo.setPhoto_id(newPhotoKey);

    //insert into database.
    myRef.child(mContext.getString(R.string.dbname_user_photos)).child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(newPhotoKey).setValue(photo);

}

private void deletePhotoFromDatabase(String image_path){
    Log.d(TAG, "deletePhotoFromDatabase: deleting photo from database");
    Log.d(TAG, "deletePhotoFromDatabase: image_path is " + image_path);

    String user_id = FirebaseAuth.getInstance().getCurrentUser().getUid();
    myRef.child(mContext.getString(R.string.dbname_user_photos))
            .child(user_id)
            .orderByValue().equalTo(image_path).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

                String photoKey = dataSnapshot.getKey();
                Log.d(TAG, "onDataChange: photo key is " + photoKey);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

我知道我还没有removeValuesetValue(null)方法,因为我无法达到正确的水平。我尝试检索的photoKey是添加到Firebase时自动生成的-L-FnLvNxLauiue4InSxE。但是,日志始终返回到其父节点UID

顺便说一句,我从Firebase存储中检索到的image_path已正确记录。

有人可以在我做错的地方给我一些灵感吗?非常感谢!

1 个答案:

答案 0 :(得分:2)

改变这个:

 myRef.child(mContext.getString(R.string.dbname_user_photos))
        .child(user_id)
        .orderByValue().equalTo(image_path)

到此:

 DatabaseReference myRef=FirebaseDatabase.getInstance().getReference();
 myRef.child("user_photos").child(user_id).orderByChild("photo_id").equalTo(image_path);

我假设user_photos是root下的直接子项,因此使用上面的myRef

编辑:

 @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
     for(DataSnapshot data : dataSnaphot.getChildren()){

            String photoKey = data.getKey();
            Log.d(TAG, "onDataChange: photo key is " + photoKey);

    } }