来自 Firebase 实时数据库的 equalTo 数据快照返回空值
equalTo datasnapshot from Firebase Realtime database returning null value
当用户启动 activity 时,应弹出一个包含父节点的 Toast,其中值 "drinkManufacturerID" 等于给定的字符串。但是,在 Toast 中返回空值。
相关代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
}
}
Firebase 实时数据库结构:
当尝试在回调之外显示包含 keys
变量值的 Toast 消息时,您将始终得到 null
,因为 onDataChange()
具有异步行为。因为该方法 returns 立即,您尝试显示的 keys
变量的值尚未从回调中填充。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒。
快速解决此问题的方法是使用移动以下代码行:
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
在 for 循环结束之后,否则我建议您从这个 in which I have explained how it can be done using a custom callback. You can also take a look at this video 中查看我的答案的最后部分以便更好地理解。
编辑:完整代码请见下方:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
Toast.makeText(this, keys, Toast.LENGTH_LONG).show(); //Should work!!
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
当用户启动 activity 时,应弹出一个包含父节点的 Toast,其中值 "drinkManufacturerID" 等于给定的字符串。但是,在 Toast 中返回空值。
相关代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
}
}
Firebase 实时数据库结构:
当尝试在回调之外显示包含 keys
变量值的 Toast 消息时,您将始终得到 null
,因为 onDataChange()
具有异步行为。因为该方法 returns 立即,您尝试显示的 keys
变量的值尚未从回调中填充。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒。
快速解决此问题的方法是使用移动以下代码行:
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
在 for 循环结束之后,否则我建议您从这个
编辑:完整代码请见下方:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
Toast.makeText(this, keys, Toast.LENGTH_LONG).show(); //Should work!!
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}