생활
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 데이터베이스도
삽입이 되지 않습니다... 도와주시면 감사하겠습니다!
55글자 더 채워주세요.
1개의 답변이 있어요!
주석에 있는 ChatRoomUid 값은 널이 나오는 것이 맞는 것 같습니다.
Activity가 실행되고나서 ChatRoomUid라는 변수를 초기화 해주는 부분이 없습니다.
Firebase에서 ChatRoomUid 값을 받기 위한 CheckChatRoom 메소드가 나중에 호출 되다보니 그런 것 같습니다.
코드를 돌려봐야 정확하게 해결이 가능해보입니다.
예상으로는 CheckChatRoom 메소드가 실행되고 ChatRoomUid 를 가지고 온뒤에 onCreate 에 있는 내용을 실행 시키면 될것 같습니다.