gpt4 book ai didi

android - 从 firebase 查询数据

转载 作者:行者123 更新时间:2023-11-29 16:59:05 33 4
gpt4 key购买 nike

我正在尝试从我的 firebase 数据库中获取项目列表...但是我在获取它们时遇到了问题。我的代码看起来或多或少像这样:

List<Items> itemsList;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_work_items_report);

itemsList = GetItems();
}

应该返回我的项目的方法如下所示:

private ArrayList<Items> GetItems(){
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = database.child("items");
final ArrayList<Items> itemsRez = new ArrayList<Items>();
Query itemsQuery = ref.orderByChild("type");

itemsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Items item = singleSnapshot.getValue(Items.class);
itemsRez.add(item);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {

}
});
return itemsRez;
}

GetItems() 总是返回一个空列表,这是有道理的,因为在我返回这个列表之前没有什么可以触发 onDataChange 事件,所以我的问题是......我怎样才能让这个方法返回数据库中的项目列表?

最佳答案

当您调用 addListenerForSingleValueEvent() 时,Firebase 客户端开始从服务器加载数据,这可能需要一些时间。为防止阻塞您的应用程序(这会导致“应用程序无响应”对话框),它会在单独的线程中加载数据。因此,在加载数据时,您的主线程继续运行并返回 itemsRez 的当前状态,这是一个空列表。

如果您在代码中添加一些日志记录语句,最容易看到这一点:

private ArrayList<Items> GetItems(){
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = database.child("items");
final ArrayList<Items> itemsRez = new ArrayList<Items>();
Query itemsQuery = ref.orderByChild("type");

System.out.println("Attaching listener");
itemsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Items item = singleSnapshot.getValue(Items.class);
itemsRez.add(item);
}
}
System.out.println("Received "+itemsRez.size()+" items");
}
@Override
public void onCancelled(DatabaseError databaseError) {

}
});
System.out.println("Returning "+itemsRez.size()+" items");
return itemsRez;
}

与您可能期望的相反,这将按以下顺序打印日志记录:

Attaching listener

Returning 0 items

Received items

您的问题的一个常见解决方案是重新构建代码的目标。与其写“先获取元素,然后用它们做 abc”,不如将代码写成“开始获取元素。然后当他们进来时,用它们做 abc”。在代码中,这意味着您将需要 itemsRec 的代码移动到 onDataChange 方法中,它将在正确的时刻被调用:当项目已加载。

另见:

关于android - 从 firebase 查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43576441/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com