我无法从我的firebase数据库接收数据

时间:2017-07-21 04:57:29

标签: android firebase firebase-realtime-database android-recyclerview

我是关于firebase和android的新手。 阅读一段时间后,我提出了一个关于我的代码的问题:

我无法从我的firebase数据库中读取信息。

这是我的代码:

    @Override
    protected void onStart() {
    super.onStart();
    mDatabase = FirebaseDatabase.getInstance().getReference();
    DatabaseReference referenceArtista = mDatabase.child("artists");
    final List<Pintura> pinturaList = new ArrayList<Pintura>();
    referenceArtista.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot artistaSnapshot: dataSnapshot.getChildren()) {
                Artista artista = artistaSnapshot.getValue(Artista.class);
                pinturaList.addAll(artista.getPinturaList());
            }
            RecyclerView recyclerViewPintura = (RecyclerView)findViewById(R.id.recyclerView);
            recyclerViewPintura.setHasFixedSize(true);
            recyclerViewPintura.setLayoutManager(new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL,false));
            AdapterPintura adapterPintura = new AdapterPintura(getBaseContext(),pinturaList);
            recyclerViewPintura.setAdapter(adapterPintura);
        }


        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

我的数据库结构如下所示: Database

我一直在调试,我看到foreach循环结束时的列表返回null。 (因此我遇到了NullPointerException并且app崩溃了)

提前致谢:)

4 个答案:

答案 0 :(得分:0)

您是否可以在onCreate方法中启动您的回收者违规行为,一旦从firebase获取数据,只需更新适配器

 pinturaList = new ArrayList<Pintura>();
                        dataSnapshot.getChildrenCount();
                        //List<User> list= new ArrayList<User>();  
                        for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                           Artista artista = artistaSnapshot.getValue(Artista.class);
                            pinturaList .add(user);
                        }  

    adapter.update(pinturaList );  

答案 1 :(得分:0)

使用ValueEventlistener而不是addListenerForSingleValueEvent然后使用forEach循环,因为如果你有多个

,则返回single或null值

答案 2 :(得分:0)

试试这个

private DatabaseReference mFirebaseDatabase;

private FirebaseDatabase mFirebaseInstance;

 mFirebaseInstance = FirebaseDatabase.getInstance();
 mFirebaseDatabase = mFirebaseInstance.getReference("YOUR TABLE NAME").getRef();


 mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if (dataSnapshot.getValue() != null) {
                    Log.v("dataSnapshot.getValue()", "" + dataSnapshot.getValue());
                    for (DataSnapshot dss : dataSnapshot.getChildren()) {
                        HashMap<String, String> map = (HashMap<String, String>) dss.getValue();

                        //get your values

                    }  
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

答案 3 :(得分:0)

由于在List<Pintura> pinturaList = new ArrayList<Pintura>();方法之外声明了onDataChange(),因此您将获得null。您需要声明并使用它inside that method并在for loop之外,否则为null,因为该方法的异步行为,在您将这些Artista类对象添加到列表。

要解决此问题,请使用以下代码:

referenceArtista.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final List<Pintura> pinturaList = new ArrayList<Pintura>();
        for (DataSnapshot artistaSnapshot: dataSnapshot.getChildren()) {
            Artista artista = artistaSnapshot.getValue(Artista.class);
            pinturaList.addAll(artista.getPinturaList());
        }
        Log.d("TAG", artista); // Here is not null
        RecyclerView recyclerViewPintura = (RecyclerView)findViewById(R.id.recyclerView);
        recyclerViewPintura.setHasFixedSize(true);
        recyclerViewPintura.setLayoutManager(new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL,false));
        AdapterPintura adapterPintura = new AdapterPintura(getBaseContext(),pinturaList);
        recyclerViewPintura.setAdapter(adapterPintura);
    }


    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

如果您想在onDataChange()方法之外使用该列表,请参阅此post的答案。