android - 如果数据已经存在,如何停止向 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;
}
}
解决方案
您在这里有两个选择:
您可以为每个工作分配一个唯一的
jobId
,并且每当用户想要申请该工作时,您可以检查他申请的任何工作是否具有该jobId
属性。而不是
push()
ing 到一个完全随机的密钥,孩子到jobId
. 这样结构将如下所示:
Users
|
|--- Random Key
|
|--- Applied Jobs
|
|--- jobId
|
|--- ...
这样,您可以检查该Applied Jobs
节点是否有任何其键为jobId
.
推荐阅读
- node.js - 如何在MongoDB中搜索所有包含关键字的文档
- asp.net-mvc - 在 AspNetCore Mvc 中使用依赖注入配置 CookieAuthenticationOptions
- android - Android:找不到 com.wix:detox:+ 的任何匹配项,因为没有可用的 com.wix:detox 版本
- android - 如何检测可访问性服务中 onKeyEvent 中键的双击?
- rest - 尝试使用 REST API 对 SharePoint 访问进行身份验证时 STS 请求无效
- angular - 如何通过 TypeScript 将字符串转换为日期
- python - 使用相同的配色方案可视化多个二维阵列
- here-api - HERE 地图中有许多 SVG DomMarker 会导致延迟
- reload - 有没有办法重新加载数值增加的网页?
- html - LeafletJS 1.6.0 地图涵盖了适用于 0.7.2 的 DIV