首页 > 解决方案 > 如果数据已经存在,如何停止向 Firebase 添加数据?

问题描述

我有一个用户节点,嵌套在它下面的是一个应用的作业节点。一个人单击“申请工作”按钮后,工作详细信息将添加到“已应用工作”节点。但是,我不想让用户再次申请。我也想过通过ID检查它是否存在,但是我意识到即使用户申请了两次工作,推送的ID也是不同的。所以,我不知道该怎么做。

正如您在下面看到的,尽管是相同的条目,但 ID 是不同的。

在此处输入图像描述

这是我迄今为止根据类似帖子尝试过的方法,但它不起作用。

JobInfo.java

package com.example.oddsynew;

import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;

import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.squareup.picasso.Picasso;

public class JobInfo extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    TextView jobName, jobCharge, jobLocation, jobDate, jobTime, jobDesc, jobTasks, addPref, recruiterName;
    ImageView profPic;
    String jobname, jobloc, jobcharge, profpic, startdate, enddate, starttime, endtime, jobdesc, jobtasks, addpref, recruitername, userID;
    ImageButton menuIcon;
    Button requestForHireBtn;
    DatabaseReference myRef, jobNameRef;
    FirebaseAuth mAuth;
    FirebaseUser u;
    DrawerLayout drawer;
    NavigationView navigationView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_job_info);

        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        menuIcon = (ImageButton) findViewById(R.id.menuIcon);
        requestForHireBtn = (Button) findViewById(R.id.requestedBtn);
        navigationView = (NavigationView) findViewById(R.id.hamburger_menu);
        navigationView.setNavigationItemSelectedListener(this);
        navigationView.setCheckedItem(R.id.nav_gigs);


        menuIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                drawer.openDrawer(GravityCompat.START);
            }
        });

        jobName = (TextView) findViewById(R.id.jobName_info);
        jobCharge = (TextView) findViewById(R.id.jobCharge_info);
        jobLocation = (TextView) findViewById(R.id.jobLocation_info);
        profPic = (ImageView) findViewById(R.id.prof_pic_info);
        jobDate = (TextView) findViewById(R.id.jobDate_info);
        jobTime = (TextView) findViewById(R.id.jobTime_info);
        jobDesc = (TextView) findViewById(R.id.jobDesc);
        jobTasks = (TextView) findViewById(R.id.jobTasks);
        addPref = (TextView) findViewById(R.id.additionalPref);
        recruiterName = (TextView) findViewById(R.id.recruiterName_info);

        jobname = getIntent().getStringExtra("jobName");
        jobloc = getIntent().getStringExtra("jobLocation");
        jobcharge = getIntent().getStringExtra("jobCharge");
        profpic = getIntent().getStringExtra("profPic");
        startdate = getIntent().getStringExtra("startDate");
        enddate = getIntent().getStringExtra("endDate");
        starttime = getIntent().getStringExtra("startTime");
        endtime = getIntent().getStringExtra("endTime");
        jobdesc = getIntent().getStringExtra("jobDesc");
        jobtasks = getIntent().getStringExtra("jobTasks");
        addpref = getIntent().getStringExtra("addPref");
        recruitername = getIntent().getStringExtra("recruiterName");

        jobName.setText(jobname);
        jobCharge.setText(jobcharge);
        jobLocation.setText(jobloc);
        jobDate.setText(startdate + " - " + enddate);
        jobTime.setText(starttime + " - " + endtime);
        jobDesc.setText(jobdesc);
        jobTasks.setText(jobtasks);
        addPref.setText(addpref);
        recruiterName.setText(recruitername);

        Picasso.get().load(profpic).into(profPic);

        requestForHireBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                mAuth = FirebaseAuth.getInstance();
                u = mAuth.getCurrentUser();
                userID = u.getUid();

                jobNameRef = FirebaseDatabase.getInstance().getReference().child("Users").child(userID).child("Applied Jobs").child("job_name");
                ValueEventListener listener = new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (!dataSnapshot.equals(jobname)) {
                            myRef = FirebaseDatabase.getInstance().getReference().child("Users").child(userID).child("Applied Jobs").push();
                            myRef.child("job_name").setValue(jobname);
                            myRef.child("job_location").setValue(jobloc);
                            myRef.child("recruiter_name").setValue(recruitername);
                            myRef.child("job_charge").setValue(jobcharge);
                            myRef.child("profile_pic").setValue(profpic);
                            myRef.child("start_date").setValue(startdate);
                            myRef.child("end_date").setValue(enddate);
                            myRef.child("start_time").setValue(starttime);
                            myRef.child("end_time").setValue(endtime);
                            myRef.child("job_desc").setValue(jobdesc);
                            myRef.child("job_tasks").setValue(jobtasks);
                            myRef.child("add_pref").setValue(addpref);
                            requestForHireBtn.setText("Request Sent!");
                            requestForHireBtn.setEnabled(false);
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Toast.makeText(JobInfo.this, "Error", Toast.LENGTH_SHORT).show();

                    }
                };
                jobNameRef.addValueEventListener(listener);
            }
        });

    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.nav_home:
                Intent intent = new Intent(JobInfo.this, Home.class);
                startActivity(intent);
                break;

            case R.id.nav_gigs:
                Intent intent2 = new Intent(JobInfo.this, MyGigs.class);
                startActivity(intent2);
                break;
        }
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}

标签: androidfirebase

解决方案


您在这里有两个选择:

  • 您可以为每个工作分配一个唯一的jobId,并且每当用户想要申请该工作时,您可以检查他申请的任何工作是否具有该jobId属性。

  • 而不是push()ing 到一个完全随机的密钥,孩子到jobId. 这样结构将如下所示:

Users
|
|--- Random Key
    |
    |--- Applied Jobs
        |
        |--- jobId
             |
             |--- ...

这样,您可以检查该Applied Jobs节点是否有任何其键为jobId.


推荐阅读