当前位置: 首页 > 知识库问答 >
问题:

用户关闭应用程序时从Firebase实时数据库中删除数据

仇征
2023-03-14

我对Android dev和Firebase很陌生。

我需要以下帮助:

 @Override
public void onDestroyView() {
    super.onDestroyView();


    mAuth.signOut();

    mDatabase.child("users").child(user.getUid()).removeValue();
    Log.i("User: ", "Not saved in database");

    user.delete()
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "User account deleted.");

                    }


                }



            });

}

提前谢谢你。

公共类AddUsername扩展片段实现View.OnClickListener,TextWatcher{

public AddUsername() {

}


public interface FragmentComm {
    void toSetName();
}

private TextView title, headings, handleError;
private EditText addUsername;
private Button nextButton;
private String getUsername;
private FirebaseAuth mAuth;
private FirebaseUser user;
private DatabaseReference mDatabase;
private FragmentComm fragmentComm;

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    fragmentComm = (FragmentComm) getActivity();
    user = FirebaseAuth.getInstance().getCurrentUser();
    mAuth = FirebaseAuth.getInstance();
    mDatabase = FirebaseDatabase.getInstance().getReference();

}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.add_username, container, false);

    title = view.findViewById(R.id.username_title);
    headings = view.findViewById(R.id.display_user_message);
    handleError = view.findViewById(R.id.message_error);
    addUsername = view.findViewById(R.id.addUsername);
    nextButton = view.findViewById(R.id.nextButton);
    nextButton.setOnClickListener(this);
    addUsername.addTextChangedListener(this);


    return view;
}


@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

}


@Override
public void afterTextChanged(Editable s) {


    getUsername = addUsername.getText().toString();

    if (getUsername.isEmpty()) {

        handleError.setVisibility(View.GONE);
        nextButton.setBackgroundColor(Color.parseColor("#EEEEEE"));
        nextButton.setTextColor(Color.parseColor("#BDBDBD"));
        nextButton.setEnabled(false);


    } else {

        Query query = FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(getUsername);
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {

                    handleError.setText(R.string.username_not_available);
                    handleError.setVisibility(View.VISIBLE);
                    handleError.setTextColor(Color.parseColor("#F50057"));
                    nextButton.setBackgroundColor(Color.parseColor("#EEEEEE"));
                    nextButton.setTextColor(Color.parseColor("#BDBDBD"));
                    nextButton.setEnabled(false);

                } else {

                    handleError.setText(R.string.username_available);
                    handleError.setVisibility(View.VISIBLE);
                    handleError.setTextColor(Color.parseColor("#26C485"));
                    nextButton.setBackgroundColor(Color.parseColor("#0277BD"));
                    nextButton.setTextColor(Color.parseColor("#FFFFFF"));
                    nextButton.setEnabled(true);

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.i("Give info", "Error");


            }
        });

    }

}


@Override
public void onClick(View v) {

    switch (v.getId()) {

        case R.id.nextButton:

            checkUsernameAlreadyExist();

    }


}

private void checkUsernameAlreadyExist() {

    getUsername = addUsername.getText().toString();


    Query query = FirebaseDatabase.getInstance().getReference().child("users").orderByChild("username").equalTo(getUsername);
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {

                handleError.setText(R.string.username_not_available);
                handleError.setVisibility(View.VISIBLE);
                handleError.setTextColor(Color.parseColor("#F50057"));


            } else {

                handleError.setText(R.string.username_available);
                handleError.setVisibility(View.VISIBLE);
                handleError.setTextColor(Color.parseColor("#26C485"));

               fragmentComm.toSetName();
                setDatabaseName();

            }
        }


        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.i("Give info", "Error");


        }
    });

}


private void setDatabaseName() {

    mDatabase.child("users").child(user.getUid()).child("username").setValue(getUsername);


}

共有1个答案

江瀚昂
2023-03-14

我认为这可能是ondisconnect处理程序的一个很好的用例。这些是应用程序在连接Firebase数据库时发送给它的写指令,数据库服务器在检测到客户端消失后执行这些指令。

这方面的一个例子是:

private void setDatabaseName() {
  DatabaseReference usernameRef = mDatabase.child("users").child(user.getUid()).child("username");
  usernameRef.setValue(getUsername);
  usernameRef.onDisconnection().removeValue();
}

有关这方面的更多信息,请参阅关于ondisconnect处理程序的Firebase文档。

  • Firebase android:使用户名唯一
  • 检查子级#askfirebase唯一值的Firebase安全规则
  • 如何防止FireBase中重复用户属性?
 类似资料:
  • 我仍在开发我的登录应用程序。此时,用户可以注册、登录和更新配置文件信息。数据存储在firebase实时数据库中,该装置也通过firebase工作。我想添加一个“删除配置文件”按钮,以便从firebase中删除用户信息。我弄清楚了如何从自动认证过程中删除用户。现在我尝试对Uid调用remove()函数,因此现在数据在实时数据库中被删除,但仍在Firebase身份验证中,如果删除userdata,应用

  • 我以为上面的办法行得通,但它失败了。我把它放在渲染行部分。它出现了reference.remove失败。第一个参数必须是有效的函数。就像在这些房间里,它有信息,我认为这是我出错的地方,但我不知道如何去做它。谢谢。

  • 我正在用firebase创建一个Ionic 2应用程序,我需要一种方法来监听数据库更改(特别是在child_added上),当应用程序关闭(即在前台、后台和被杀)时 基本上,我想使用WebRTC在whatsapp这样的应用程序内进行呼叫,我正在关注这篇文章https://websitebeaver.com/insanely-simple-webRTC-video-chat-using-fireba

  • 我如何删除记录“苹果”(在图片中标记)? 根据文档,要移除一个项,需要对引用调用removeValue()。但要获得引用,我需要子ID。因为它是一个随机生成的id(-kisnx87ayigsh3ilp0d),如何删除它?

  • 我正在尝试删除 Firebase 实时数据库中用户之间的消息。我能够成功删除消息,但我想添加一个条件,即用户无法删除他收到的消息,只能删除他发送的消息,目前用户能够删除他收到的消息以及他从firebase实时数据库中发送的消息。 我的代码 MessageActivity.java MessageAdapter.java 聊天.java

  • 我在我的react本地应用程序中使用Firebase实时数据库。大多数事情都是通过REST API云函数来完成的。app中很少东西直接使用实时数据库。最近,我发现我数据库中的所有数据都被莫名其妙地删除了。甚至数据库中不再使用且未在我的应用程序/云功能的源代码中引用的部分也消失了。 问题发生在两个项目及其数据库(生产/测试)中。我必须使用备份来恢复它们,但即使没有人使用应用程序(例如,在测试环境中)