读取 Firebase 时出错:从 firebase 值到子值

Error in reading the Firebase: from firebase value to child

我已经为 onClick 按钮创建了一个事件处理程序。当我点击按钮时,我想将数据库中的一个预先记录的号码传输到价格部分。

我的问题是:当我点击按钮时,想要将数据库中记录的值“pricecode”传递给“price”。但pricecode必须预先记录在数据库中。

String price = String.valueOf(db.child("User").child("pricecode"));

而不是值“1000”,它写入了对那里的键的引用。在屏幕截图中阅读更多信息。

public void onClickB1 (查看视图)

    {
        DatabaseReference db = FirebaseDatabase.getInstance().getReference();
        String id = mDataBase.getKey();
        String name = String.valueOf(textB1.getText());

        String price = String.valueOf(db.child("User").child("pricecode")); // PROBLEM

        User newUser = new User(id,name,price);
        //mDataBase.push().setValue(newUser);

        if (!TextUtils.isEmpty(name))
        {
            mDataBase.push().setValue(newUser);
        }
        else
        {
            Toast.makeText(this,"empty text",Toast.LENGTH_LONG).show();
        }
    }

String price = String.valueOf(db.child("User").child("pricecode")); and instead of the value "1000", it writes a reference to the key there.

这是自以下操作以来的预期行为:

String price = String.valueOf(db.child("User").child("pricecode"))

price 变量中存储 pricecode 字段的实际值 (1000)。 valueOf() 方法中的代码是一个引用,因此当您将该引用传递给 valueOf() 方法时,您会得到:

https://testkornze...

因此,没有 方法可以读取实时数据库中存在的特定字段的值,而无需 附加侦听器。我之前回答了你的 关于如何读取 pricecode 的值。因此,为了能够使用 pricecode 的值,所有需要从数据库获取数据的操作都应该添加到 onComplete() 方法中。

正如 Alex 所解释的那样,此代码仅构建对数据库中路径的引用,但实际上并未从该路径中读取值:

db.child("User").child("pricecode")

要读取该值,您需要调用 addListenerForSingleValueEvent 或对引用调用 get,如 reading data once 上的 Firebase 文档所示。基于此:

db.child("User").child("pricecode").get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (!task.isSuccessful()) {
            Log.e("firebase", "Error getting data", task.getException());
        }
        else {
            DataSnapshot snapshot = task.getResult()l

            String price = String.valueOf(snapshot.getValue());

            User newUser = new User(id,name,price);
            //mDataBase.push().setValue(newUser);

            if (!TextUtils.isEmpty(name))
            {
                mDataBase.push().setValue(newUser);
            }
            else
            {
                Toast.makeText(this,"empty text",Toast.LENGTH_LONG).show();
            }
        }
    }
});