생활
Firebase 데이터베이스 구현 중 값이 가져와지지 않습니다.
package com.example.test01.chat; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.example.test01.R; import com.example.test01.SignUp; import com.example.test01.model.ChatModel; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; import java.util.List; import java.util.Objects; public class MessageActivity extends AppCompatActivity{ private String destinationUID; private FirebaseAuth mAuth; private String uid; private String ChatRoomUid; private EditText editText; private Button button; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_message); FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); assert user != null; final String uid = user.getUid(); destinationUID = getIntent().getStringExtra("destinationUID"); final Button button = findViewById(R.id.messageActivity_button); editText = (EditText)findViewById(R.id.messageActivity_editText); /*if(ChatRoomUid == null){ ChatModel chatModel = new ChatModel(); FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ChatRoomRef = database.getReference(); chatModel.users.put(uid, true); chatModel.users.put(destinationUID,true); ChatRoomRef.child("ChatRooms").push().setValue(chatModel); }else{*/ button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { ChatModel chatModel = new ChatModel(); chatModel.users.put(uid,true); chatModel.users.put(destinationUID,true); final String Messss = ""+destinationUID+" "+uid+" "+ChatRoomUid+""; if(ChatRoomUid == null){ button.setEnabled(false); FirebaseDatabase.getInstance().getReference().child("ChatRooms").push() .setValue(chatModel).addOnSuccessListener(new OnSuccessListener<Void>(){ @Override public void onSuccess(Void aVoid) { CheckChatRoom(); Toast.makeText(MessageActivity.this,Messss, Toast.LENGTH_SHORT).show(); } }); } else{ ChatModel.Comment comment = new ChatModel.Comment(); comment.uid = uid; comment.message = editText.getText().toString(); FirebaseDatabase.getInstance().getReference().child("ChatRooms").child(ChatRoomUid).child("comments").push().setValue(comment).addOnCompleteListener(new OnCompleteListener<Void>(){ @Override public void onComplete(@NonNull Task<Void> task) { editText.setText(""); } }); }} }); CheckChatRoom(); } void CheckChatRoom(){ FirebaseDatabase.getInstance().getReference() .child("ChatRooms").child("users").orderByChild(destinationUID).equalTo(true).addListenerForSingleValueEvent(new ValueEventListener(){ @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { for(DataSnapshot item : dataSnapshot.getChildren()){ //왜 여기서 널포인터익셉션뜰까??? ChatModel chatModel = item.getValue(ChatModel.class); assert chatModel != null; if (chatModel.users.containsKey(uid)) { ChatRoomUid = item.getKey(); button.setEnabled(true); chatModel.users.clear(); } } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MessageActivity.this, "그냥 실패", Toast.LENGTH_SHORT).show(); } }); } }해당 코드인데 주석 부분에서 RoomUid가 null로 호출 되는데
원하는 방햐응로 호출하고 싶습니다.. 그래서 그런지 comments 데이터베이스도
삽입이 되지 않습니다... 도와주시면 감사하겠습니다!
1개의 답변이 있어요!
주석에 있는 ChatRoomUid 값은 널이 나오는 것이 맞는 것 같습니다.
Activity가 실행되고나서 ChatRoomUid라는 변수를 초기화 해주는 부분이 없습니다.
Firebase에서 ChatRoomUid 값을 받기 위한 CheckChatRoom 메소드가 나중에 호출 되다보니 그런 것 같습니다.
코드를 돌려봐야 정확하게 해결이 가능해보입니다.
예상으로는 CheckChatRoom 메소드가 실행되고 ChatRoomUid 를 가지고 온뒤에 onCreate 에 있는 내용을 실행 시키면 될것 같습니다.