Как изменить документ в Firestore без строковой ошибки? - PullRequest
1 голос
/ 15 октября 2019

В моем приложении первый пользователь создает имя пользователя, которое я сохраняю в Firestore как документ, и задаю его как displayName (username = имя документа = displayName). В приложении пользователь может изменить свое имя пользователя, введя новое имя в EditText. В результате данные, хранящиеся под его текущим именем пользователя, перемещаются в новый документ с новым именем пользователя. Поэтому сначала я проверяю, используется ли новое имя пользователя кем-то еще, если нет, я создаю новый документ, именем которого является новое имя пользователя. Теперь я получаю текущее displayName (которое является текущим именем пользователя) в виде строки и ввод EditText в виде строки (новое имя пользователя). Я реализовал метод для перемещения документов отсюда: Как переместить документ в Cloud Firestore?

Но когда я вызываю метод, подобный этому moveFirestoreDocument(usernameInput, oldUsername );, я получаю:

moveFirestoreDocument нельзя применить к (String, String)

Как я могу решить эту проблему? Могу ли я изменить метод moveFirestoreDocument, чтобы он также мог принимать строки?

Вот метод:

public void moveFirestoreDocument(DocumentReference fromPath, final DocumentReference toPath) {
        fromPath.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document != null) {
                        toPath.set(document.getData())
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Log.d(TAG, "DocumentSnapshot successfully written!");
                                        fromPath.delete()
                                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                    @Override
                                                    public void onSuccess(Void aVoid) {
                                                        Log.d(TAG, "DocumentSnapshot successfully deleted!");
                                                    }
                                                })
                                                .addOnFailureListener(new OnFailureListener() {
                                                    @Override
                                                    public void onFailure(@NonNull Exception e) {
                                                        Log.w(TAG, "Error deleting document", e);
                                                    }
                                                });
                                    }
                                })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Log.w(TAG, "Error writing document", e);
                                    }
                                });
                    } else {
                        Log.d(TAG, "No such document");
                    }
                } else {
                    Log.d(TAG, "get failed with ", task.getException());
                }
            }
        });
    }

1 Ответ

2 голосов
/ 16 октября 2019

Появляется следующая ошибка:

Я получаю "moveFirestoreDocument не может быть применен к (String, String)

, поскольку вы пытаетесь перейти к moveFirestoreDocument() метод два аргумента типа String и не типа DocumentReference. Чтобы иметь возможность перемещать документ, оба типа fromPath и toPath должны иметь тип DocumentReference, чтобы вы могли вызыватьset() в toPath и get() и delete() в fromPath.

Можно ли изменить метод moveFirestoreDocument, чтобы он также мог принимать строки?

Нет необходимости менять метод, вы можете просто передать правильные аргументы при его вызове. Согласно деталям, которые вы предоставили в вопросе, я понимаю, что у вас есть схема, подобная этой:

Firestore-root
   |
   --- users (collection)
         |
         --- John (document)
              |
              --- //User details

Чтобы переименовать документ, вызовите метод, используя:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
DocumentReference oldUsernameRef = usersRef.document(oldUsername);
DocumentReference usernameInputRef = usersRef.document(usernameInput);
moveFirestoreDocument(oldUsernameRef, usernameInputRef);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...