Я пытаюсь переместить записи пользователей пожарного хранилища после проверки подлинности с использованием пакета. Кажется, чтобы скопировать записи, но не удаление.
Приложение Android запускается в анонимном режиме, когда пользователь решает зарегистрироваться, я пытаюсь переместить его записи новому пользователю, прошедшему проверку подлинности по SMS.
Перед регистрацией я получаю все записи пользователей, используя listRef.get () и прослушиватель Success. Я чем сохраняю приведенный QuerySnapshot. После успешной аутентификации по SMS я использую снимок для копирования и удаления.
Я использую snapshot.getReference (), чтобы найти запись. Я подтвердил, что в режиме отладки правильный путь ссылки
Чтобы убедиться, что код удаления работает, я создал тестовый метод, и он сработал.
Путь в firestore: списки / пользователи / uid /
private void retrieveDataBeforeVerify() {
CollectionReference listRef = db.collection( "lists" ).document("users").
collection( mCurrentUser.getUid() );
listRef.get()
.addOnSuccessListener( new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
mQuerySnapshot = queryDocumentSnapshots; //Save snapshort
startPhoneNumberVerification(mPhoneNumberField.getText().toString()); //Start auth
}
} );
}
}
После смс-аутентификации
private void moveDataToNewUser() {
if (mQuerySnapshot != null) {
if (mCurrentUser != null) {
DocumentReference listRef = db.collection( "lists" ).document( "users" );
WriteBatch batch = db.batch();
for (QueryDocumentSnapshot documentSnapshot : mQuerySnapshot) {
Main main = documentSnapshot.toObject( Main.class );
batch.set( listRef.collection( mCurrentUser.getUid() ).document( ) , main); //Copy working correctly
DocumentReference reference = documentSnapshot.getReference(); //On debug, reference shows correct path
batch.delete( reference ); //Delete does not work
}
batch.commit().addOnFailureListener( new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e( TAG, "moveDataToNewUser: batch failed" );
}
} ).addOnSuccessListener( new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d( TAG, "moveDataToNewUser: batch success" );
}
} );
}
}
}
обновление
Я изменил ссылку на что-то несуществующее, но слушатель onSuccess все еще срабатывает. Как это может быть ??
DocumentReference reference = documentSnapshot.getReference().collection( "22" ).document("123");
обновление
если я прокомментирую первые две строки цикла for, удаление будет успешным. Похоже, что партия не может обрабатывать и устанавливать, и удалять в одной и той же партии. Я также пытался использовать транзакцию, но получил аналогичные результаты. имеет ли это смысл?
кстати - я использую com.google.firebase: firebase-firestore: 18.2.0, я считаю, что это самая последняя версия
for (QueryDocumentSnapshot documentSnapshot : mQuerySnapshot) {
//Main main = documentSnapshot.toObject( Main.class );
//batch.set( listRef.collection( mCurrentUser.getUid() ).document( ) , main); //Copy working correctly
DocumentReference reference = documentSnapshot.getReference(); //On debug, reference shows correct path
batch.delete( reference ); //Delete success!
}