目的的Android - 火力地堡 - 從X節點檢索數據並將其發送到節點Y
允許用戶發送到當局報告。報告將被保存並在新的報告是由同一個用戶輸入
圖片當前數據庫不會被覆蓋
在簽訂當前用戶能夠存儲「事件報告」進入數據庫,但顯然當用戶提交另一個「事件報告」時,新提交的「事件報告」將覆蓋先前的「事件報告」的數據。
Desired數據庫
的黃色突出顯示數據應該是從「用戶」子「名」,這是紅色圓圈數據
例如檢索到的數據,如果數據在紅色圓圈數據是「安倍長」,黃色突出顯示的數據也將是「安倍長」。
除此之外,當用戶簽署的當前提交「事件報告」時,每創建一個新的創建一個新的唯一密鑰。這意味着它不會覆蓋以前提交的數據。
報告片段類
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();
}
}
});
}
}
附加評論
- 報告片段是如何工作的
我不打算爲當前登錄的用戶能夠提交他們的名字,這將創建一個寶用戶將其他人的姓名輸入到「事件報告」中。我打算檢索「當前用戶已登錄」名稱並自動將其輸入到「事件報告」中。
- 如何報告片段編碼
而不是把jReportByUserDatabase.setValue(incidentReportUser)
同時使用Map<String, Object>
我試圖把.updateChildren
的。問題是,每個數據是下一個「唯一ID」,將「事故報告」下保存不進入數據樹
解決方案中的問題
的幫助下由Cadet和JavaBanana編寫
實現「For循環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) {
}
});
}
謝謝你的回答!感謝您向我展示生成新密鑰的方式:String reportId = dbRef.push()。getKey(); '但是如果我想從**紅色圓圈**數據中檢索「名稱」怎麼辦? – Student
「用戶」節點或「事件報告」節點中的用戶名? – JavaBanana
「用戶」節點中的用戶名。當前數據庫的**圖片是我目前使用的圖片**,我希望生成**圖片的期望數據庫**。用戶的「姓名」不是由當前用戶輸入,而是當他/她提交「事件報告」時從當前用戶檢索到的 – Student