瞄准
允许用户向当局发送报告。当同一用户输入新报告时,报告将被存储并且不会被覆盖
当前数据库图片
当前登录的用户可以将“事件报告”存储到数据库中,但显然当用户提交另一个“事件报告”时,新提交的“事件报告”将覆盖先前“事件报告”的数据
所需数据库的图片
Yellow Highlighted 数据应该是从“Users”子“name”中检索的数据,即 Red Circled 数据
例如,如果红色圆圈数据中的数据是“Abe Long”,则黄色突出显示的数据也将是“Abe Long”。
除此之外,当当前登录的用户提交“事件报告”时,每个新创建的报告都将创建一个新的唯一 key 。这意味着它不会覆盖之前提交的数据。
报告 fragment 类
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.Date;
import java.util.HashMap;
public class ReportFragment extends Fragment {
private EditText jReportDatePick;
private EditText jReportTimeEnt;
private EditText jReportLocationEnt;
private EditText jReportDescriptionEnt;
private Button jReportSendBtn;
private FirebaseUser jReportCurrentUserID;
private DatabaseReference jReportByUserDatabase;
private ProgressDialog jReportLoad;
public ReportFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View viewRoot = inflater.inflate(R.layout.fragment_report, container, false);
jReportDatePick = viewRoot.findViewById(R.id.reportDatePick);
jReportTimeEnt = viewRoot.findViewById(R.id.reportTimeEnt);
jReportLocationEnt = viewRoot.findViewById(R.id.reportLocationEnt);
jReportDescriptionEnt = viewRoot.findViewById(R.id.reportDescriptionEnt);
jReportSendBtn = viewRoot.findViewById(R.id.reportSendBtn);
jReportLoad = new ProgressDialog(getActivity());
jReportSendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String userReportDate = jReportDatePick.getText().toString();
String userReportTime = jReportTimeEnt.getText().toString();
String userReportLocation = jReportLocationEnt.getText().toString();
String userReportDescription = jReportDescriptionEnt.getText().toString();
if(!TextUtils.isEmpty(userReportDate)&&
!TextUtils.isEmpty(userReportTime)&&
!TextUtils.isEmpty(userReportLocation)&&
!TextUtils.isEmpty(userReportDescription)){
submitReport(userReportDate, userReportTime, userReportLocation, userReportDescription);
jReportLoad.setTitle("Sending Report");
jReportLoad.setMessage("Please wait while the report is being sent");
jReportLoad.setCanceledOnTouchOutside(false);
jReportLoad.show();
}else{
jReportLoad.dismiss();
Toast.makeText(getActivity(), "Report failed to be sent due to empty inputs", Toast.LENGTH_SHORT).show();
}
}
});
return viewRoot;
}
private void submitReport(final String userReportDate,final String userReportTime,
final String userReportLocation,final String userReportDescription) {
jReportCurrentUserID = FirebaseAuth.getInstance().getCurrentUser();
final String reportUserID = jReportCurrentUserID.getUid();
jReportByUserDatabase = FirebaseDatabase.getInstance().getReference().child("Incident Reports").child(reportUserID);
HashMap<String, String> incidentReportUser = new HashMap<>();
incidentReportUser.put("date", userReportDate);
incidentReportUser.put("time", userReportTime);
incidentReportUser.put("location", userReportLocation);
incidentReportUser.put("description", userReportDescription);
jReportByUserDatabase.setValue(incidentReportUser).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
jReportLoad.dismiss();
Toast.makeText(getActivity(), "Report was Sent", Toast.LENGTH_SHORT).show();
jReportDatePick.setText("");
jReportTimeEnt.setText("");
jReportLocationEnt.setText("");
jReportDescriptionEnt.setText("");
}else{
jReportLoad.dismiss();
Toast.makeText(getActivity(), "Report failed to be sent", Toast.LENGTH_SHORT).show();
}
}
});
}
}
附加评论
- 报告 fragment 的工作原理
我不打算让当前登录的用户能够提交他们的姓名,这将导致用户将其他人的姓名输入到“事件报告”中。我打算自动检索“CurrentUser signed in”名称并将其输入到“Incident Report”中。
- 报告 fragment 的编码方式
而不是把 jReportByUserDatabase.setValue(incidentReportUser)
我试过把 .updateChildren
使用 Map<String, Object>
时.问题是每个数据都没有在“唯一 ID”下输入,该 ID 将存储在数据树中的“事件报告”下
问题的解决方案
Helped by both Cadet and JavaBanana
实现“For Loop DataSnapshot”以循环遍历数据并通过还使用包含名称、地址、状态等的“用户类”检索所需的数据。
private void submitReport(final String userReportDate,final String userReportTime,
final String userReportLocation,final String userReportDescription) {
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
dbRef.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Users user = snapshot.getValue(Users.class);
HashMap<String, String> incidentReportUser = new HashMap<>();
incidentReportUser.put("name", user.name);
incidentReportUser.put("date", userReportDate);
incidentReportUser.put("time", userReportTime);
incidentReportUser.put("location", userReportLocation);
incidentReportUser.put("description", userReportDescription);
jReportCurrentUserID = FirebaseAuth.getInstance().getCurrentUser();
final String reportUserID = jReportCurrentUserID.getUid();
jReportByUserDatabase = FirebaseDatabase.getInstance().getReference().child("Incident Reports").child(reportUserID);
jReportByUserDatabase.push().setValue(incidentReportUser).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
jReportLoad.dismiss();
Toast.makeText(getActivity(), "Report was Sent", Toast.LENGTH_SHORT).show();
jReportDatePick.setText("");
jReportTimeEnt.setText("");
jReportLocationEnt.setText("");
jReportDescriptionEnt.setText("");
}else{
jReportLoad.dismiss();
Toast.makeText(getActivity(), "Report failed to be sent", Toast.LENGTH_SHORT).show();
}
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
最佳答案
这样写 (推送添加值,而不是覆盖)。
jReportByUserDatabase.push()setValue(incidentReportUser)
另外,我建议让 Report 节点也包含用户字段。就像将它们组合成平面节点。
关于java - Android - Firebase - 从节点 X 检索数据并将其发送到节点 Y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46405006/