【问题标题】:How do I get a random key assigned by Firebase Realtime Database for Android?如何获取 Firebase Realtime Database for Android 分配的随机密钥?
【发布时间】:2022-02-04 15:33:35
【问题描述】:

每当我尝试获取密钥时,它都会给我一个随机密钥,而不是我之前在日志中拥有的正确密钥,并且数据也不会被删除。

FirebaseDatabase databas = FirebaseDatabase.getInstance();
DatabaseReference myjsd = database.getReference().child("JoinUS_Data");

这是我要删除的数据:

这就是我目前尝试删除它的方式:

String key = myjsd.push().getKey();
myjsd.child(key).removeValue();
Log.d("keylog", "onComplete: "+key);

运行该代码后,数据库中的数据不会被删除,并且我在日志中不断获得一个随机键:

2022-02-04 11:49:57.102 10212-10212/com.example.pahalbackend D/keylog: onComplete: -Mv2NvEgCBoWN3b6q5nQ

【问题讨论】:

  • 请把你的问题写得更准确。当你写你的问题时,它并不能帮助我们理解你真正的问题是什么。无论您是想要新密钥还是从数据库中获取特定密钥。

标签: java android firebase firebase-realtime-database


【解决方案1】:

下一行中的DatabaseReference#push() 创建了一个新的DatabaseReference 对象,其中包含基于当前时间随机生成的密钥。这就是数据没有按预期删除的原因,因为您正在“删除”甚至还不存在的数据。

String key = myjsd.push().getKey();

要更正此问题,您需要找到数据库中存在的密钥。为此,您必须首先使用许多available filters 之一为它perform a query。在下面的示例中,我正在搜索包含等于 "jehe""name" 字段的数据。

Query myjsdQuery = myjsd // the parent Reference
    .orderByChild("name") // the property to search on
    .equalTo("jehe") // return children that have "name"="jehe"
    .limitToFirst(1); // return at most one result

myjsdQuery.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child : dataSnapshot.getChildren()) {
            child.removeValue(new DatabaseReference.CompletionListener() {
                @Override
                public void onComplete(DatabaseError error, DatabaseReference ref) {
                    if (error !== null) {
                        // Failed. TODO: Log/handle exception.
                        Log.w(TAG, "myjsdQuery:onDeleted", databaseError.toException());
                        return;
                    }

                    Log.i(TAG, "myjsdQuery:onDeleted", "Successfully deleted data!");
                }
            });
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Failed. TODO: Log/handle exception.
        Log.w(TAG, "myjsdQuery:onCancelled", databaseError.toException());
    }
});

或者,您可以使用类似于JavaScript 中的PromiseTask 链接来简化上述代码:

Query myjsdQuery = myjsd // the parent Reference
    .orderByChild("name") // the property to search on
    .equalTo("jehe") // return children that have "name"="jehe"
    .limitToFirst(1); // return at most one result

myjsdQuery.get()
    .onSuccessTask(new SuccessContinuation<DataSnapshot, String>() {
        @NonNull
        @Override
        public Task<void> then(DataSnapshot dataSnapshot) {
            // this is set to work when there is only one child of the returned data!
            // you'll need to use Tasks.WhenAll() or a multi-location database update for more than one result
            for (DataSnapshot child : parent.getChildren()) {
                return child.removeValue();
            }
            return Tasks.forResult(null); // handle case where there are no results
        }
    })
    .addOnCompleteListener(new OnCompleteListener<void>() {
        @NonNull
        @Override
        public void onComplete(Task<void> task) {
            if (!task.isSuccessful()) {
                // Failed. TODO: Log/handle exception.
                Log.w(TAG, "myjsdQuery:onCompleteError", databaseError.toException());
                return;
            }

            Log.i(TAG, "myjsdQuery:onDeleted", "Successfully deleted data!");
        }
    });

免责声明:我的 Java 有点生锈,这是徒手编写的,所以可能会有一两个错字。

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    相关资源
    最近更新 更多