我尝试使用批处理进行身份验证后移动Firestore用户记录。似乎是复制记录,但不删除。
Android应用程序以匿名模式启动,当用户决定注册时,我尝试将其记录移至新的SMS身份验证用户。 在注册之前,我使用listRef.get()和成功侦听器获取所有用户记录。我比保存结果QuerySnapshot。 SMS身份验证成功后,我使用快照进行复制和删除。
我使用snapshot.getReference()查找记录。我在调试模式下确认参考路径正确
为确保删除代码有效,我制定了一种测试方法,该方法可以正常工作。
firestore中的路径为:lists / users / 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
}
} );
}
}
经过SMS认证
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!
}