首页 > 解决方案 > 从另一个类调用方法时,firebase java admin sdk datasnapshot 循环不启动的奇怪错误

问题描述

我有一个类DataBase,它有一个名为“query”的方法,它基本上将节点“riferimento”的所有子节点放入一个arraylist

public ArrayList<ContenutoDAO> query(String riferimento)
{
    ArrayList<ContenutoDAO> res=new ArrayList<>();

    DatabaseReference ref = FirebaseDatabase.getInstance().getReference(riferimento);


    ref.addListenerForSingleValueEvent(new ValueEventListener()
    {
        private ContenutoDAO temp=null;

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for(DataSnapshot ds:dataSnapshot.getChildren())
            {
                temp=new ContenutoDAO();
                temp.setTipo(ds.child("tipo").getValue(String.class));
                temp.setTitolo(ds.child("titolo").getValue(String.class));
                temp.setValore(ds.child("valore").getValue(String.class));
                res.add(temp);

                System.out.println("prova-prova"); 
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return res;
}

当监听器被附加时,for 循环根本不会执行,直到我调用 temp.setTipo(...)、temp.setTitolo(...) 和 temp.setValore(...)。这些方法不会让for 循环已执行。如果我删除这些方法,for 循环可以工作,这是 ContenutoDAO 类:

public class ContenutoDAO {

private SimpleStringProperty tipo;
private SimpleStringProperty titolo;
private SimpleStringProperty valore;


public void setTipo(String tipo) {
    this.tipo.set(tipo);
}

public void setTitolo(String titolo) {
    this.titolo.set(titolo);
}

public void setValore(String valore) {
    this.valore.set(valore);
}

public String getTipo() {
    return tipo.get();
}

public String getTitolo() {
    return titolo.get();
}

public String getValore() {
    return valore.get();
}

public StringProperty tipoProperty() {
    return tipo;
}

public StringProperty titoloProperty() {
    return titolo;
}

public StringProperty valoreProperty() {
    return valore;
}}

我尝试了很多解决方案,例如:

1.在 ContenutiDAO 类中使用字符串而不是 simplestringproperty

  1. 填充数据快照的数组列表并以另一种方法将其转换为 ContenutoDAO 的数组列表

    3.将查询方法的代码放入类库的构造函数中(构造函数初始化firebaseapp)

    4.创建 3 个字符串数组列表(节点的每个子节点一个:tipo、titolo 和值)然后用值填充它,然后使用这些数据填充 ContenutiDAO 的数组列表

这是数据库结构

-root
---音乐博物馆
-----chuck berry
-------contenuto0
------------valore: value
------------tipo : 价值
------------titolo: 价值
-------contenuto1
------------价值: 价值
---------- --tipo: 价值
------------titolo: 价值

我需要找回音乐博物馆/查克贝利的所有孩子。
对不起,我的英语不好,我知道这是一个奇怪的错误,谢谢你的关注。

标签: javafirebasefor-loopfirebase-realtime-databasefirebase-admin

解决方案


推荐阅读