Как обновить элемент в Firestore RecyclerView? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь обновить элемент в моем RecyclerView с помощью кнопки сохранения на панели инструментов, которая вызывает updateQuestion().

У меня есть эта структура в моей базе Firebase:

Questions

-> list_of_documents wUniqueIDs

---> поля в документах:

+ question

+ answer

+ rating

пока у меня это под updateQuestion()

private void updateQuestion() {
        String questionString = mQuestionTextView.getText().toString();
        Object updatedText = mQuestionEditText.getText().toString();
        String questionPath2 = rootRef.collection("Questions").document().getPath();

        FirebaseFirestore rootRef = FirebaseFirestore.getInstance();

        CollectionReference collectionReference = rootRef.collection(questionPath2).document().update("question", updatedText); // <--- I GET ERROR HERE
}
error: incompatible types: Task<Void> cannot be converted to CollectionReference

Ранее я также получил сообщение о том, что второй параметр для update() должен быть объектом, однако эта ошибка, похоже, исчезла.

Я пытался следовать учебным пособиям и просматривал другие посты в stackOverflow, но, похоже, никто не решает эту проблему.

Вот что я пробовал ранее:

//        CollectionReference ref = rootRef.collection("Questions").document().collection("question");
//        CollectionReference ref = rootRef.collection("Questions").document().collection(questionPath);

//        Toast.makeText(this, "this is the path: " + questionPath, Toast.LENGTH_SHORT).show();
//        Log.d(TAG, "updateQuestion: " + ref.get(question.getAnswer));
//        Log.d(TAG, "updateQuestion: " + ref.collection(questionPath).document("question", questionPath).toString())
//        Log.d(TAG, "updateQuestion: " + ref.document(questionPath)("question").toString());
//        Log.d(TAG, "updateQuestion: " + ref.document(questionPath).get(question).toString());
//        ref.collection("question")
//        db.child("Spacecraft").push().setValue(spacecraft);
//        rootRef.collection("Questions").document().update("question", updatedText);
//        rootRef.collection("Questions").document(questionPath).update("question", updatedText);

//        TextView savedText = mQuestionTextView.setText(updatedText);

//        DocumentReference documentReference = rootRef.collection("Questions").document(questionPath).update("question", );
//        DocumentReference documentReference = rootRef.document(questionPath).update("question", updatedText);
//        CollectionReference collectionReference = rootRef.collection(questionPath).document().update("question", updatedText);

Любая помощь приветствуется.

------------------ Пересмотренный код на 2019 - 04 - 07 @ 1153 вечера ---------

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.save_question:
                mShowSaveIcon = false;
                updateQuestion();
                break;

            case R.id.edit_question:
                item.setVisible(false);
                enableEditMode();
                mShowSaveIcon = true;
                break;

        }
        invalidateOptionsMenu();
        return true;
    }

    private void enableEditMode(){

        mQuestionEditText = findViewById(R.id.questionEditTextID);
        mPostAnswerButton.setEnabled(false);
        mPostAnswerButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

        mCommentButton.setEnabled(false);
        mCommentButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

        String questionString = mQuestionTextView.getText().toString();
        mQuestionTextView.setVisibility(View.GONE);
        mQuestionEditText.setVisibility(View.VISIBLE);
        mQuestionEditText.setText(questionString);
    }



    private void updateQuestion(){
        Question question = createQuestionObj();
        updateQuestionToCollection(question);
    }

    private Question createQuestionObj(){
        final Question question = new Question();
        return question;
    };

private void updateQuestionToCollection(Question question) {
        String questionString = mQuestionTextView.getText().toString();
        Object updatedText = mQuestionEditText.getText().toString();


        FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
        String docId = rootRef.collection("Questions").document().getId();
        System.out.println(docId);
        String questionPath = rootRef.collection("Questions").document(docId).collection("question").getPath();
//        String questionPath2 = rootRef.collection("Questions").document(docId).getPath();

        System.out.println(questionPath);
        rootRef.collection(questionPath).document(docId).update("question", updatedText).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "onSuccess: it worked");
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "onFailure: it failed because of: " + e.toString());
            }
        });

finish();
 }
};

Фрагмент структуры базы данных ниже

enter image description here

1 Ответ

1 голос
/ 08 апреля 2019

Когда я смотрю на ваш код, я вижу две проблемы. Первая ошибка следующая:

error: incompatible types: Task<Void> cannot be converted to CollectionReference

Это происходит потому, что при вызове метода update() для объекта DocumentReference возвращаемый объект имеет тип Task<Void> и , а не CollectionReference. Также обратите внимание, что в Java нет способа, которым вы можете привести объект CollectionReference к Задаче. Чтобы решить эту проблему, просто удалите объявление вашего collectionReference объекта следующим образом:

rootRef.collection(questionPath2).document("specificDocId").update("question", updatedText);

Вторая проблема заключается в том, что вы генерируете новый идентификатор документа каждый раз, когда вызываете updateQuestion(), поскольку вы не передаете какой-либо идентификатор методу document(). Чтобы иметь возможность обновить конкретный документ, вам нужно передать фактический идентификатор документа, чтобы он мог быть обновлен:

rootRef.collection(questionPath2).document("specificDocId").update("question", updatedText);

Edit:

Для обновления документа используйте эту ссылку:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference questionsRef = rootRef.collection("questions");
DocumentReference docRef = questionsRef.document("yCCRgoRIAmtmKmTFLYJX");
docRef.update("question", updatedText);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...