Я получил несколько раз одни и те же данные из базы данных Firebase, мне нужно только один раз из базы данных Firebase - PullRequest
0 голосов
/ 17 ноября 2018

Я недавно создал приложение, которое все еще находится в разработке.Нужна ваша помощь, потому что всякий раз, когда я получаю данные из базы данных 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

В моем приложении я получил несколько раз одно и то же msg и name

А также я хочу, чтобы данные были в структуре базы данных моего приложения.

1 Ответ

0 голосов
/ 17 ноября 2018

Если вы хотите прочитать информацию профиля пользователя только один раз, используйте addListenerForSingleValueEvent вместо addValueEventListener.Итак:

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

Также см. Документацию Firebase о считывании данных один раз .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...