所以我在从数据库中检索数据时遇到了麻烦。我认为问题出在退货声明中。
当我运行应用程序时,应显示flatID的调试文本为空白。我确信数据是在数据库上,所以这不是问题。
我对Java和编程一般都很陌生,感谢您的帮助和耐心:)代码如下。
flatID = readFlatID();
debug1.setText(flatID);
public String readFlatID(){
String uid = mAuth.getCurrentUser().getUid().toString();
mDatabase.child("Users").child(uid).child("Flat")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
flat = dataSnapshot.getValue().toString();
Toast.makeText(getApplicationContext(),"Data Read Successfully",Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return flat;
}
答案 0 :(得分:0)
Firebase方法是异步的。这就是为什么没有设置文本的原因。您可以设置一个侦听器并将其传递给该方法,以便在获取数据时获得回调。这就是我所说的代码方式:
//Create an interface
interface IDatabaseLoad {
void onDataLoadSuccess(String data);
void onDataLoadFailed();
}
//Initialize it
IDatabaseLoad databaseLoad = new IDatabaseLoad() {
@Override
public void onDataLoadSuccess(String data) {
debug1.setText(data);
Toast.makeText(getApplicationContext(),"Data Read Successfully",Toast.LENGTH_SHORT).show();
}
@Override
public void onDataLoadFailed() {
}
};
//modify your method
public void readFlatID(final IDatabaseLoad listener){
String uid = mAuth.getCurrentUser().getUid().toString();
mDatabase.child("Users").child(uid).child("Flat")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listener.onDataLoadSuccess(dataSnapshot.getValue().toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
listener.onDataLoadFailed();
}
});
}
现在您只需要调用readFlatID(databaseLoad)
,TextView
将在获取数据后设置数据。
答案 1 :(得分:0)
从Firebase服务器获取数据是在移动设备上的后台线程上执行的,应用程序实际加载整个数据需要一些时间。这就是return flat;
在执行代码时不返回任何内容的原因。
最简单的解决方案是,您必须将所有想要处理的数据放在onDataChange()方法中。你可以这样做:
public void readFlatID() {
String uid = mAuth.getCurrentUser().getUid().toString();
mDatabase.child("Users").child(uid).child("Flat")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
flat = dataSnapshot.getValue().toString();
debug1.setText(flat);
Toast.makeText(getApplicationContext(), "Data Read Successfully", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
答案 2 :(得分:0)
您现在无法返回尚未加载的内容。 onDataChange()
方法具有异步行为,这意味着甚至在您尝试从数据库中获取flat
对象之前就会调用该行为。这就是null
方法之外总是onDataChange()
的原因。换句话说,当您返回flat
对象时,数据尚未从数据库中完成加载,因此快速解决此问题的方法是仅在onDataChange()
方法中使用该值或者如果你想在外面使用它,请深入到异步世界并创建你自己的回调,如我在 post 的答案的最后部分所述。