感谢您的帮助。我正在创建一个运行良好的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());
}
}
});
下面是我的数据库外观的图片:
答案 0 :(得分:1)
这是逻辑..!使用 addListenerForSingleValueEvent 。它仅被调用一次。而且仅当快照不存在时才获取密钥
<table>
<tbody>
<ng-container *ngIf="{sample : sum} as variable">
<tr *ngFor="let a of data;let in=index">
<td>{{a}}</td>
<td><input type='text' #i [ngModel]="a"/></td>
<td>{{i.value*a}}</td>
<td style="display:none;">{{variable.sample[in+1] =variable.sample[in]+ i.value*a}}</td>
</tr>
<tr>
<td></td>
<td></td>
<td>SUM={{variable.sample[data.length]}}</td>
</tr>
</ng-container>
</tbody>
</table>
答案 1 :(得分:0)
我希望信息仅在第一次存储,如果 用户下次单击该按钮时,应将其转到 预先生成的节点
这可能是由于addValueEventListener()
造成的。
您可以尝试使用addListenerForSingleValueEvent()
,它只可以执行一次。
答案 2 :(得分:0)
使用以下代码行时:
DatabaseReference user_message_push = mRootRef.child("Chat").child(uid).push();
m = user_message_push.getKey();
您每次单击按钮都会生成一个新的随机ID。 push()
方法就是这样做的。如果您想第二次单击该按钮以访问相同的引用,则应将该ID存储在变量中,然后再次使用相同的变量,不生成另一个变量。