无法批量删除Firestore参考

时间:2019-03-26 21:59:47

标签: android firebase google-cloud-firestore

我尝试使用批处理进行身份验证后移动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!
                }

0 个答案:

没有答案