【问题标题】:I got multiple times same data from firebase database, I need only once from firebase database我从 firebase 数据库中获得了多次相同的数据,我只需要从 firebase 数据库中获得一次
【发布时间】:2018-11-17 04:55:00
【问题描述】:

我最近创建了一个仍在开发中的应用程序。 需要您的帮助,因为每当我从 firebase 数据库中获取数据时,我都会多次获得单个数据。看看我的代码,数据库,你可以正确地得到我的问题,你也会得到我想说的。

我的代码:

public class FragmentChat extends Fragment
{
EditText mMsgInput;
Button mSend;
LinearLayout mMsgContainerTv;
ScrollView mMsgContainer;
ProgressDialog mProgressDialog;

String name, email, image;

FirebaseAuth mAuth;
DatabaseReference mDataRef, mChatroomRef, mMessageRef;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    super.onCreateView(inflater, container, savedInstanceState);

    View chat = inflater.inflate(R.layout.fragment_chat, container, false);

    mMsgInput = (EditText) chat.findViewById(R.id.fragment_chatETMsg);
    mSend = (Button) chat.findViewById(R.id.fragment_chatBTSend);
    mMsgContainerTv = (LinearLayout) chat.findViewById(R.id.fragment_chatLLMsgContainer);
    mMsgContainer = (ScrollView) chat.findViewById(R.id.fragment_chatSVMsgContainer);

    mAuth = FirebaseAuth.getInstance();
    mDataRef = FirebaseDatabase.getInstance().getReference();
    mChatroomRef = FirebaseDatabase.getInstance().getReference().child("Chatroom");

    if(mAuth.getCurrentUser() == null){
        Toast.makeText(getActivity(), "Please Login First", Toast.LENGTH_SHORT).show();
    }else{
        mProgressDialog = new ProgressDialog(getActivity());
        mProgressDialog.setTitle("Loading data...");
        mProgressDialog.setMessage("Please wait while we load your data into activity...");
        mProgressDialog.setCanceledOnTouchOutside(false);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgressDialog.show();

        mDataRef.child("Users").child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener(){
                @Override
                public void onDataChange(DataSnapshot dataSnapshot)
                {
                    name = dataSnapshot.child("name").getValue().toString();
                    email = dataSnapshot.child("email").getValue().toString();
                    image = dataSnapshot.child("image").getValue().toString();

                    mProgressDialog.dismiss();
                }

                @Override
                public void onCancelled(DatabaseError p1)
                {
                    mProgressDialog.dismiss();
                }
            });

        sendmsg();
    }
    return chat;
}

@Override
public void onStart()
{
    super.onStart();

    if(mAuth.getCurrentUser() != null){
        mChatroomRef.addChildEventListener(new ChildEventListener(){
                @Override
                public void onChildAdded(DataSnapshot data, String s)
                {
                    if(data.exists()){
                        displayMsg(data);
                    }
                }

                @Override
                public void onChildChanged(DataSnapshot data, String s)
                {
                    if(data.exists()){
                        displayMsg(data);
                    }
                }

                @Override
                public void onChildRemoved(DataSnapshot data)
                {
                }

                @Override
                public void onChildMoved(DataSnapshot data, String s)
                {
                }

                @Override
                public void onCancelled(DatabaseError ata)
                {
                }
            });
    }
}

private void sendmsg()
{
    mSend.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v)
            {
                String msg = mMsgInput.getText().toString();

                HashMap<String, Object> mHashmapS = new HashMap<String, Object>();
                mChatroomRef.updateChildren(mHashmapS);
                String mMessageKey = mChatroomRef.push().getKey();
                mMessageRef = mChatroomRef.child(mMessageKey);
                HashMap<String, Object> mHashmapMessage = new HashMap<String, Object>();
                mHashmapMessage.put("name", name);
                mHashmapMessage.put("msg", msg);
                mMessageRef.updateChildren(mHashmapMessage);

                mMsgInput.setText("");

                Toast.makeText(getActivity(), "Message sent successfully...", Toast.LENGTH_SHORT).show();
            }
        });
}

private void displayMsg(DataSnapshot data)
{
    Iterator it = data.getChildren().iterator();
    while(it.hasNext()){
        String msgMsg = (String) ((DataSnapshot) it.next()).getValue();
        String msgName = (String) ((DataSnapshot) it.next()).getValue();

        LayoutInflater mInflator = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View mView = mInflator.inflate(R.layout.item_msg, null);
        TextView mMsgView = (TextView) mView.findViewById(R.id.item_msgTVMsg);
        mMsgView.append(msgName + " :\n" + msgMsg + "\n ");
        mMsgContainerTv.addView(mView, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

        mMsgContainer.fullScroll(ScrollView.FOCUS_DOWN);
    }
}
}

我的数据库结构: 聊天室 >> messagekey >> 1. msg, 2. name

在我的应用程序中,我得到了多次相同的消息和名称

我还希望将数据库结构中的数据以数据库结构的方式放入我的应用程序中。

【问题讨论】:

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


    【解决方案1】:

    如果您只想读取一次用户个人资料信息,请使用addListenerForSingleValueEvent 而不是addValueEventListener。所以:

    mDataRef.child("Users").child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener(){
    

    另见Firebase documentation on reading data once

    【讨论】:

    • 但我正在使用,按子键创建新子并从那里获取数据。在接收数据时我没有子密钥。
    猜你喜欢
    • 2023-03-18
    • 2020-08-15
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2021-01-28
    • 2020-12-22
    • 1970-01-01
    相关资源
    最近更新 更多