繁体   English   中英

使用嵌套的addValueEventListener时出现Android Firebase错误

[英]Android firebase error when using nested addValueEventListener

我正在使用使用FireBase的Android应用程序。 在我添加的数据库中,我向一个用户出版物中添加了两个表。 我放置了发布信息和URI的数量,以便通过另一个表为每个用户的信息检索信息。 当我这样做时,我需要使用数据库事件

(.addValueEventListener).

嵌套但出现错误

(错误:(157,33)错误:从内部类内部访问局部变量UserName;需要声明为final)

这是使用的代码

  private void UserPostInformation(final String key) {
    DatabaseReference historyDatabase = FirebaseDatabase.getInstance().getReference().child("ThePostting").child(key);
    historyDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


            if (dataSnapshot.exists())
            {
                String IdHistory = dataSnapshot.getKey();
                Long time = 0L;
                String foodname11 = "";
                String imagefood1 = "";
                String s = null;
                String name = "name";
                String UserName = "";
                for (DataSnapshot  child : dataSnapshot.getChildren())
                {
                    if (child.getKey().equals("time")) {
                        time = Long.valueOf(child.getValue().toString());

                    }
                    if (child.getKey().equals("FoodName")) {
                        foodname11 = child.getValue().toString();

                    }

                    if (child.getKey().equals("profileImageUrl")) {
                        imagefood1 = child.getValue().toString();
                    }
                    if (child.getKey().equals("UserID")) {


                        s = child.getValue().toString();

                    }
                }

                UserIDGetInfo =  s;


                DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(UserIDGetInfo);
                databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        if (dataSnapshot.exists())
                        {

                            Map<String,Object> map = (Map<String,Object>) dataSnapshot.getValue();

                            if (map.get("name")!=null)
                            {

      //error is her where using the String UserName get the error  local variable UserName is accessed from within inner class; needs to be declared final)
                            UserName= map.get("name").toString();
                        }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

                HistoryObject obj =new HistoryObject(IdHistory , getDate(time),foodname11 , imagefood1 , UserName);
                resultHistory.add(obj);
                mhistoryAdapter.notifyDataSetChanged();

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

我使用的数据库的这一部分 在此处输入图片说明

UserName声明为该类的属性,您也将正确获得UserName空值,因为在完成User加载之前设置了HistoryObject的实例

签出我的修复

private String UserName = "";
private void UserPostInformation(final String key) 
{
    DatabaseReference historyDatabase = FirebaseDatabase.getInstance().getReference().child("ThePostting").child(key);
    historyDatabase.addValueEventListener(new ValueEventListener() 
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


            if (dataSnapshot.exists())
            {
                String IdHistory = dataSnapshot.getKey();
                Long time = 0L;
                String foodname11 = "";
                String imagefood1 = "";
                String s = null;
                String name = "name";
                UserName = "";
                for (DataSnapshot  child : dataSnapshot.getChildren())
                {
                    if (child.getKey().equals("time")) {
                        time = Long.valueOf(child.getValue().toString());

                    }
                    if (child.getKey().equals("FoodName")) {
                        foodname11 = child.getValue().toString();

                    }

                    if (child.getKey().equals("profileImageUrl")) {
                        imagefood1 = child.getValue().toString();
                    }
                    if (child.getKey().equals("UserID")) {


                        s = child.getValue().toString();

                    }
                }

                UserIDGetInfo =  s;


                DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(UserIDGetInfo);
                databaseReference.addListenerForSingleValueEvent(new ValueEventListener() 
                {

                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        if (dataSnapshot.exists())
                        {
                            Map<String,Object> map = (Map<String,Object>) dataSnapshot.getValue();
                            if (map.get("name")!=null)
                            {
                                UserName= map.get("name").toString();
                            }


                            HistoryObject obj = new HistoryObject(IdHistory , getDate(time),foodname11 , imagefood1 , UserName);
                            resultHistory.add(obj);
                            mhistoryAdapter.notifyDataSetChanged();

                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });


            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

要么将用户名声明为类变量,要么将修饰符更改为final,显然错误是local variable UserName is accessed from within inner class; needs to be declared final local variable UserName is accessed from within inner class; needs to be declared final因此将其声明为final Stirng userName

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM