读取 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();
}
}
}
});
我已经为 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();
}
}
}
});