0

私は本当にこの問題に固執しています。私はrealtimedatabase firebaseからいくつかのユーザーを削除しようとしています。 Firebaseから提供されている電子メール/パスワード認証を使用しています。私が再認証した後、ユーザーはdbからデータを削除しようとします。 firebaseからエラーが拒否されました(com.google.firebase.database.DatabaseException:Firebaseデータベースエラー:権限が拒否されました)。どうして?ここでユーザーは認証されていますが、データベースからデータを削除できません。

は私のコードです:ここでは

public void reAuthenticateUser(String password) { 
    final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    AuthCredential credential = EmailAuthProvider 
      .getCredential(user.getEmail(), password); 
    user.reauthenticate(credential) 
      .addOnCompleteListener(new OnCompleteListener<Void>() { 
       @Override 
       public void onComplete(@NonNull Task<Void> task) { 
        if (!task.isSuccessful()) { 
         handleExceptions(task.getException()); 
        } else { 
         dialog.dismiss(); 

         DBHelper.getInstance().deleteUser(user.getUid());//the problem is here 

         deleteUserAccount(); 
        } 
       } 
      }); 

} 

は私のDBHelperクラスです:

public class DBHelper { 

private static DBHelper instance = null; 
private FirebaseDatabase database; 
private DatabaseReference ref; 

private DBHelper() { 
    database = FirebaseDatabase.getInstance(); 
} 

public static DBHelper getInstance() { 
    if (instance == null) 
     instance = new DBHelper(); 

    return instance; 
} 

public void saveUserOnDB(String userId, String name, String email) { 
    ref = database.getReference().child("users"); 
    ref.child(userId).setValue(new User(name, email)); 
} 

public void deleteUser(String userId) { 
    ref = database.getReference().child("users"); 
    ref.child(userId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() { 
     @Override 
     public void onComplete(@NonNull Task<Void> task) { 
      if(!task.isSuccessful()){ 
       Log.e("TAG","onComplete",task.getException()); 
      } 
     } 
    }); 
}} 

Firebaseルール:デバッグモードで

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null" 
    } 
} 

、すべては、また、正常に動作し、データベースのルールをパブリックに切り替えると、データはdbから削除されます。

答えて

0

あなたがユーザーのデータの削除を要求した後、ユーザーのアカウントを削除していることが表示されます:

DBHelper.getInstance().deleteUser(user.getUid()); 

deleteUserAccount(); // <== does this call FirebaseUser.delete()? 

、あなたはおそらく、アカウントの削除は非同期データの前に効果を取っている競合状態を作成しているので、場合削除が完了しました。データ削除の完了リスナーにdeleteUserAccount()への呼び出しを移動してください:

public void deleteUser(String userId) { 
    ref = database.getReference().child("users"); 
    ref.child(userId).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() { 
     @Override 
     public void onComplete(@NonNull Task<Void> task) { 
      if(task.isSuccessful()){ 
       deleteUserAccount(); // <== MOVE HERE 
      } else { 
       Log.e("TAG","onComplete",task.getException()); 
      } 
     } 
    }); 
} 
+0

ありがとうございます。それは今働く:D – Gabriela

関連する問題