android– 从firebase查询数据

android– 从firebase查询数据,第1张

概述我想从我的firebase数据库中获取一个项目列表……但是我在获取它们时遇到了问题.我的代码看起来或多或少像这样:List<Items>itemsList;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_

我想从我的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事件,所以我的问题是…我怎么能让这个方法返回项目列表来自DB?

解决方法:

当您调用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方法中,在该方法中,它将在适当的时刻调用:当项目已加载时.

另见:

> @L_502_0@
> Firebase/Android: Adding retrieved values from Firebase to arraylist returns null pointer exception
> Wait Firebase async retrive data in android
>这blog post from Doug Stevenson

总结

以上是内存溢出为你收集整理的android – 从firebase查询数据全部内容,希望文章能够帮你解决android – 从firebase查询数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104049.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存