java - 每次单击按钮时,都会在 Firebase 中创建节点
问题描述
感谢您的帮助。我正在创建一个运行良好的 Android 应用程序。但我面临一个小问题。该应用程序包含已发布广告的消息功能。当用户打开广告时,他会看到呼叫或消息两个选项,如果用户点击消息按钮,那么他会被发送到聊天屏幕,在按下按钮时,信息会存储在 firebase 数据库中,但是我希望信息只在第一次存储,如果用户下次单击按钮,那么他应该被带到预先生成的节点,而不是新节点。
下面是我在单击按钮时添加新节点的代码。请让我知道是否有任何方法可以阻止在每次单击按钮时生成节点:
mChat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent chatIntent = new Intent(ExpandActivity.this, ChatActivity.class);
chatIntent.putExtra("user_id", mId);
chatIntent.putExtra("user_name", mName);
chatIntent.putExtra("ad_id", user_id);
chatIntent.putExtra("cow", m);
startActivity(chatIntent);
mRootRef.child("Chat").child(uid).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
DatabaseReference user_message_push = mRootRef.child("Chat").child(uid).push();
m = user_message_push.getKey();
if (!dataSnapshot.hasChild(user_id)) {
mRootRef.child("AdvertData").child(user_id).addValueEventListener(new
ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String image = dataSnapshot.child("image").getValue().toString();
String title = dataSnapshot.child("title").getValue().toString();
String price = dataSnapshot.child("price").getValue().toString();
Map chatAddMap = new HashMap();
chatAddMap.put("seen", false);
chatAddMap.put("timestamp", ServerValue.TIMESTAMP);
chatAddMap.put("image", image);
chatAddMap.put("title", title);
chatAddMap.put("price", price);
chatAddMap.put("chatUser", mName);
chatAddMap.put("ads", user_id);
chatAddMap.put("chatUserId", mId);
Map chatAddMap1 = new HashMap();
chatAddMap1.put("seen", false);
chatAddMap1.put("timestamp", ServerValue.TIMESTAMP);
chatAddMap1.put("image", image);
chatAddMap1.put("title", title);
chatAddMap1.put("price", price);
chatAddMap1.put("chatUser", name);
chatAddMap1.put("ads", user_id);
chatAddMap1.put("chatUserId", uid);
Map chatUserMap = new HashMap();
chatUserMap.put("Chats/" + uid + "/" + m, chatAddMap);
chatUserMap.put("Chats/" + mId + "/" + m, chatAddMap1);
mRootRef.updateChildren(chatUserMap, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError != null) {
Log.d("CHAT_LOG", databaseError.getMessage().toString());
}
}
});
下面是我的数据库的样子:
解决方案
这是逻辑..!使用addListenerForSingleValueEvent。它只被调用一次。并且仅在快照不存在时获取密钥
DatabaseReference user_message_Ref = mRootRef.child("Chat").child(uid);
// First check if snapshot exist()
user_message_Ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists())
{
// GO TO THE DESIRED ACTIVITY
navigateToYOURActivity();
}else
{
// GET KEY
String key = user_message_Ref.push().getKey();
// & UPDATE DATABASE
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
推荐阅读
- c++ - 我们如何才能让字符数组在 C++ 中只接受字母
- javascript - 在 Deno 中读取记录到控制台的值
- reactjs - npm run build 不起作用 - 没有生成生成,脚本停止而不打印任何内容
- button - 如何在颤动中使用 2 个按钮控制抽屉和 endDrawer
- azure - 长时间运行的 Azure 函数返回 502,但该函数实际上已经完成了工作
- firebase - 如果有firebase用户的信息,我想对passwordhash字段进行加密,我从firebase收到什么json
- php - 如何解决在 LiteSpeed 服务器上找不到 PHP 页面
- abap - 像整数数组一样声明和使用内部表
- compiler-errors - Ionic 4 Admob 集成错误:java.lang.NoClassDefFoundError:(解析失败:Lcom/google/android/gms/internal/zzur;)
- c++ - 如何打印与特定值对应的元素的总和?