Firestore, как получить данные из пожарного магазина в представлении переработчика

1

Фон

Мое приложение позволяет пользователям публиковать изображения в определенных категориях, а затем позволяет пользователям нажимать на сообщения, чтобы вызвать функцию обмена сообщениями.

проблема

В настоящее время он настроен таким образом, что это глобальный чат (любой пользователь может присоединиться к нему, и он был одинаковым для всех сообщений, читающих и пишущих из одного и того же документа) для целей тестирования, но я хочу, чтобы он был личным чатом между двумя пользователи. Это было создано с использованием базы данных в реальном времени, в которой я нахожусь в процессе миграции в Firestore, поэтому мне также придется изменить код для "chatActivity"

Что я сделал

Когда сообщение создано, оно добавляет новый документ в коллекцию сообщений для этого сообщения. Имя документа сообщений, связанное с этим сообщением, затем сохраняется в сообщении.

Где я застрял

В своей работе в чате мне нужно иметь возможность получить идентификатор сообщения, чтобы затем можно было найти местоположение документа, содержащего сообщения, связанные с этим сообщением.

Задача

Чтобы пользователи могли публиковать изображения и иметь документ в коллекции "Сообщения", они должны быть созданы ЗАВЕРШЕНЫ, чтобы второй пользователь пришел и увидел упоминание упомянутого изображения, а затем смог открыть тот документ, который был создан для изображение, чтобы два пользователя могли затем обмениваться сообщениями друг с другом, делая его закрытым для двух пользователей, потому что они читают только из документа, связанного с этим сообщением

рабочий процесс приложения это должно устранить любую путаницу

База данных: Изображение 174551

Код для записи поста в базу данных:

filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    final String downloadUrl =
                                            uri.toString();
                                    Log.d("tag", downloadUrl);

                                    FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
                                    String uid = Objects.requireNonNull(current_user).getUid();

                                    final Map<String, Object> postMap = new HashMap<>();
                                    // No thumb ?????
                                    postMap.put("image_url", downloadUrl);
                                    postMap.put("desc", desc);
                                    postMap.put("user_id", current_user_id);
                                    postMap.put("message Doc", uid + postCategory);
                                    postMap.put("timestamp", FieldValue.serverTimestamp());


                                    firebaseFirestore.collection(postCategory).add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                                        @Override
                                        public void onComplete(@NonNull Task<DocumentReference> task) {

                                            if (task.isSuccessful()) {

                                                firebaseFirestore.collection("Posts").add(postMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                                                    @Override
                                                    public void onComplete(@NonNull Task<DocumentReference> task) {

                                                        FirebaseUser current_user = FirebaseAuth.getInstance().getCurrentUser();
                                                        String uid = Objects.requireNonNull(current_user).getUid();

                                                        final Map<String, String> chatMap = new HashMap<>();
                                                        postMap.put("timestamp", FieldValue.serverTimestamp());
                                                        postMap.put("name", current_user_id);
                                                        postMap.put("message", "");

                                                        firebaseFirestore.collection("Messages")
                                                                .document(uid + postCategory)
                                                                .set(chatMap)
                                                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                                    @Override
                                                                    public void onSuccess(Void aVoid) {

                                                                    }
                                                                });

Код для чата

public class ChatActivity extends AppCompatActivity {

    public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
    private static final int GALLERY_PICK = 1;

    private ListView mMessageListView;
    private MessageAdapter mMessageAdapter;// This is to do with the file messageadapter\
    private ProgressBar mProgressBar;
    private ImageButton mPhotoPickerButton;
    private EditText mMessageEditText;
    private Button mSendButton;
    private String mUsername;
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mMessagedatabaseReference;
    private ChildEventListener mChildEventListner;
    private ValueEventListener mValueEventListner;
    private FirebaseUser mCurrentUser;
    private FirebaseStorage mFirebaseStorage;
    private ProgressDialog mProgressDialog;
    private StorageReference mChatPhotosStorageReference;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_activity);

        mFirebaseDatabase = FirebaseDatabase.getInstance();
        mMessagedatabaseReference = mFirebaseDatabase.getReference().child("messages");


        //new shit

        // Map<String, Object> usersChat = new HashMap<>();
        // usersChat.put("user 1 id", mCurrentUser);
        // usersChat.put("user2Id", )





        mFirebaseStorage = FirebaseStorage.getInstance();
        mChatPhotosStorageReference = mFirebaseStorage.getReference().child("chat_photos");

        // Initialize references to views
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mMessageListView = (ListView) findViewById(R.id.messageListView);
        mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
        mMessageEditText = (EditText) findViewById(R.id.messageEditText);
        mSendButton = (Button) findViewById(R.id.sendButton);

        mCurrentUser = FirebaseAuth.getInstance().getCurrentUser();
        final String current_uid = mCurrentUser.getUid();

        // Initialize progress bar
        mProgressBar.setVisibility(ProgressBar.INVISIBLE);

        //Initialize message ListView and its adapter
        List<FriendlyMessage> friendlyMessages = new ArrayList<>();
        mMessageAdapter = new MessageAdapter(this, R.layout.item_message, friendlyMessages);
        mMessageListView.setAdapter(mMessageAdapter);

        // ImagePickerButton shows an image picker to upload a image for a message
        mPhotoPickerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent galleryIntent = new Intent();
                galleryIntent.setType("image/*");
                galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

                startActivityForResult(Intent.createChooser(galleryIntent, "Select Image"), GALLERY_PICK);
            }
        });

        // Enable Send button when there text to send
        mMessageEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (charSequence.toString().trim().length() > 0) {
                    mSendButton.setEnabled(true);
                } else {
                    mSendButton.setEnabled(false);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });
        mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)});

        // Send button sends a message and clears the EditText
        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString());
                mMessagedatabaseReference.push().setValue(friendlyMessage);

                // Clear input box
                mMessageEditText.setText("");
            }
        });

        mChildEventListner = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class);
                mMessageAdapter.add(friendlyMessage);

            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };
        mMessagedatabaseReference.addChildEventListener(mChildEventListner);

        mSendButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString(), current_uid, null);
                mMessagedatabaseReference.push().setValue(friendlyMessage);

                // Clear input box
                mMessageEditText.setText("");
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == GALLERY_PICK && resultCode == RESULT_OK) {

            Uri selectedImageUri = data.getData();

            final StorageReference photoRef = mChatPhotosStorageReference.child(selectedImageUri.getLastPathSegment());

            photoRef.putFile(selectedImageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    photoRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            String downloadUrl = uri.toString();
                            Log.d("tag", downloadUrl);
                            FriendlyMessage friendlyMessage = new FriendlyMessage(null, mUsername, downloadUrl);
                            mMessagedatabaseReference.push().setValue(friendlyMessage);
                        }
                    });
                }
            });

        }
    }
Теги:
firebase
google-cloud-firestore

1 ответ

0

Где я застрял

В своей работе в чате мне нужно иметь возможность получить идентификатор сообщения, чтобы затем можно было найти местоположение документа, содержащего сообщения, связанные с этим сообщением.

я не уверен, вы хотите получить все идентификаторы или только один идентификатор?

если вы хотите получить документ ALL id из music коллекции из магазина, пожалуйста, добавьте это в свой код:

public void loadAlltQueries(){
 Query loadAllQueryId = firebaseFirestore
                       .collection("music")
                       .orderBy("timestamp", Query.Direction.DESCENDING);

  loadAllQueryId.addSnapshotListener(new EventListener<QuerySnapshot>(){
    @Override
    public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e){


     for (DocumentChange doc : documentSnapshots.getDocumentChanges()){

       if (doc.getType() == DocumentChange.Type.ADDED){

          String musicId = doc.getDocument().getId();
          FriendlyMessage friendlyMessage = doc.getDocument().toObject(FriendlyMessage.class).withId(musicId);                        

          mMessageAdapter.add(friendlyMessage);                                                                       

          mMessageAdapter.notifyDataSetChanged(); //for update adapter
        }
     }

    }
  });
}

и сделать MusicId.class

public class MusicId{

    @Exclude
    public String MusicId;

    public <T extends MusicId> T withId(@NonNull final String id) {

        this.MusicId = id;
        return (T) this;
    }

}

не забудьте добавить это в Your FriendlyMessage.class

public class FriendlyMessage extends MusicId {

// your constructor
// your getter

}

и из вашего класса адаптера получить свой геттер

 final String musicId = contentList.get(position).MusicId;

и теперь вы получите свой идентификатор CHur40Nr..

Если вы хотите получить идентификатор поста, который соответствует любому посту, выбранному из представления переработчика. Пожалуйста, сделайте класс holder.setMessage(message);, потому что метод holder получит ваше сообщение, которое вы выбрали в этом случае holder для holder.setMessage(message);

public class AdapterFriendlyMessage extends RecyclerView.Adapter<FriendlyMessage.ViewHolder> {

    public List<FriendlyMessage> contentList;
    public Context context;

    private FirebaseFirestore firebaseFirestore;
    private FirebaseAuth firebaseAuth;

    public AdapterFriendlyMessage(List<FriendlyMessage> contentList){
        this.contentList = contentList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_friendly_message, parent, false);
        context = parent.getContext(); FriendlyMessage(container.getContext(), contentList);

        firebaseFirestore = FirebaseFirestore.getInstance();
        firebaseAuth = FirebaseAuth.getInstance();

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.setRecyclable(false);

        // GET MusicId
        final String  musicId = contentList.get(position). MusicId;
        final String currentUserId = firebaseAuth.getCurrentUser().getUid();   


        String uid = contentList.get(position).getUid();
        firebaseFirestore.collection(" Music").document( musicId).collection("FriendlyMessage").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>(){
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task){

                if (task.isSuccessful()) {

                    String message = task.getResult().getString("message");
                    holder.setMessage(message); // this is what you want
                } 
            }
        });       
    }

    @Override
    public int getItemCount() {
        return contentList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private View mView;    

        private TextView txtMessage;           

        public ViewHolder(View itemView){
            super(itemView);
            mView = itemView;   

        }

            public void setMessage(Sting text) {

                txtMessage = mView.findViewById(R.id.text_view_mesage);
                txtMessage.setText(text);
            }


    }
}

не забудьте передать id из firestore в открытый класс Adapter FriendlyMessageRoom extends Fragment {

private RecyclerView recyclerMessage;
private List<FriendlyMessage > contentList;
private AdapterFriendlyMessage adapterFriendlyMessage;        

private FirebaseFirestore firebaseFirestore;
private FirebaseAuth mAuth;



public FriendlyMessageRoom() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_friendly_message_room, container, false);


    mAuth = FirebaseAuth.getInstance();
    firebaseFirestore = FirebaseFirestore.getInstance();

    contentList = new ArrayList<>();
    recyclerMessage = view.findViewById(R.id.recycler_message);
    adapterFriendlyMessage = new AdapterFriendlyMessage(contentList);
    recyclerMessage.setLayoutManager(new LinearLayoutManager(container.getContext()));
    recyclerMessage.setAdapter(adapterFriendlyMessage);

    return view;
}

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

    loadAlltQueries(); // please see firebase query that i write above
}

ПРИМЕЧАНИЕ: мой ответ может не дать точного ответа на ваш вопрос, так как трудно представить, что вы хотите в описании проблемы.

  • 0
    эй, спасибо за ответ. Я ищу, чтобы получить только один идентификатор, в частности, идентификатор сообщения, которое выбирается пользователем в представлении переработчика. Ваша идея создания класса для Musicid.class, я не думаю, будет работать для меня, потому что я планирую добавить много категорий, поэтому я не думаю, что создание множества файлов было бы осуществимо, было бы хорошей альтернативой.
  • 0
    @ Wazy Вы хотите получить только один идентификатор, вы имеете в виду идентификатор пользователя? а какие категории Вы имеете в виду, коллекцию или документ?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню