# #java #android #firebase-realtime-database #timestamp
Вопрос:
Вот моя структура данных
"Posts" : { "-MnL-M_t4hHrcaqWecDM" : { "description" : "", "picture" : "", "postKey" : "-MnL-M_t4hHrcaqWecDM", "timeStamp" : 1635677993574, "title" : "", "userId" : "", "userPhoto" : "" }, "-MnL-xtVgZAC2TIY6Whn" : { "description" : "", "picture" : "", "postKey" : "", "timeStamp" : 1635678150450, "title" : "", "userId" : "", "userPhoto" : "" },
Я хочу удалить сообщения, в которых есть старая отметка времени. Я использую метод equalTo, а не EnDat для практики. Поэтому я использую этот код
private void beginDelete() { DatabaseReference db = FirebaseDatabase.getInstance().getReference(); Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").equalTo("1635677993574"); queryByTimestamp.get().addOnCompleteListener(new OnCompleteListenerlt;DataSnapshotgt;() { @Override public void onComplete(@NonNull Tasklt;DataSnapshotgt; task) { if(task.isSuccessful()){ for (DataSnapshot ds : task.getResult().getChildren()){ ds.getRef().removeValue(); Toast.makeText(PostDetailActivity.this,"게시글이 삭제되었습니다.",Toast.LENGTH_SHORT).show(); } } else{ Log.d("TAG",task.getException().getMessage()); Toast.makeText(PostDetailActivity.this,"게시글이 삭제안되었습니다.",Toast.LENGTH_SHORT).show(); } } });
поэтому я использую запрос для обозначения «Метки времени» в сообщениях -gt; «-MnL-M_t4hHrcaqWecDM» -gt;gt; «Метка времени» как это. Но я думаю, что «-MnL-M_t4hHrcaqWecDM» может создать проблему. Может ли запрос найти «Метку времени» через дочерний элемент «-MnL-M_t4hHrcaqWecDM»? Потому что я могу удалять сообщения с помощью postKey.. Как здесь.
StorageReference picRef = FirebaseStorage.getInstance().getReferenceFromUrl(postImage); picRef.delete() .addOnSuccessListener(new OnSuccessListenerlt;Voidgt;() { @Override public void onSuccess(Void aVoid) { //image deleted, now delete database Query fquery =FirebaseDatabase.getInstance().getReference("Posts").orderByChild("postKey").equalTo("-MDFJ23..."); fquery.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { for (DataSnapshot ds:dataSnapshot.getChildren()){ ds.getRef().removeValue(); // remove values from firebase where postkey matches } //Deleted Toast.makeText(PostDetailActivity.this,"게시글이 삭제되었습니다.",Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { //failed, can't go further Toast.makeText(PostDetailActivity.this,"" e.getMessage(),Toast.LENGTH_SHORT).show(); } });
Here is a full code.
ImageView imgPost,imgUserPost,imgCurrentUser; TextView txtPostDesc,txtPostDateName,txtPostTitle; EditText editTextComment; Button btnAddComment; String PostKey; FirebaseAuth firebaseAuth; FirebaseUser firebaseUser; FirebaseDatabase firebaseDatabase; RecyclerView RvComment; CommentAdapter commentAdapter; Listlt;Commentgt; listComment; static String COMMENT_KEY = "Comment"; InputMethodManager imm; EditText et; Button btnDeletePost; String myUid; String UId; String postImage; private DatabaseReference mDatabase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_post_detail); imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); et = (EditText)findViewById(R.id.post_detail_comment); // let's set the statue bar to transparent // ini Views RvComment = findViewById(R.id.rv_comment); imgPost =findViewById(R.id.post_detail_img); imgUserPost = findViewById(R.id.post_detail_user_img); imgCurrentUser = findViewById(R.id.post_detail_currentuser_img); txtPostTitle = findViewById(R.id.post_detail_title); txtPostDesc = findViewById(R.id.post_detail_desc); txtPostDateName = findViewById(R.id.post_detail_date_name); editTextComment = findViewById(R.id.post_detail_comment); btnAddComment = findViewById(R.id.post_detail_add_comment_btn); btnDeletePost = findViewById(R.id.button_delete); firebaseAuth = FirebaseAuth.getInstance(); firebaseUser = firebaseAuth.getCurrentUser(); firebaseDatabase = FirebaseDatabase.getInstance(); // add post delete button mDatabase= FirebaseDatabase.getInstance().getReference(); myUid = FirebaseAuth.getInstance().getCurrentUser().getUid(); btnDeletePost.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //여기 수정 주의 UId.equals(myUid) if (true){ Toast.makeText(PostDetailActivity.this,"삭제중...",Toast.LENGTH_SHORT).show(); beginDelete(); //onBackPressed(); } else{ Toast.makeText(PostDetailActivity.this,"다른 사용자의 게시글입니다.",Toast.LENGTH_SHORT).show(); } } }); // add Comment button click listner btnAddComment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { btnAddComment.setVisibility(View.INVISIBLE); DatabaseReference commentReference = firebaseDatabase.getReference(COMMENT_KEY).child(PostKey).push(); String comment_content = editTextComment.getText().toString(); String uid = firebaseUser.getUid(); String uname = firebaseUser.getDisplayName(); if (firebaseUser.getPhotoUrl()!=null){ String uimg = firebaseUser.getPhotoUrl().toString(); Comment comment = new Comment(comment_content,uid,uimg,uname); commentReference.setValue(comment).addOnSuccessListener(new OnSuccessListenerlt;Voidgt;() { @Override public void onSuccess(Void aVoid) { showMessage("comment added"); editTextComment.setText(""); btnAddComment.setVisibility(View.VISIBLE); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { showMessage("fail to add comment : " e.getMessage()); } }); } else{ String usphoto =Integer.toString(R.drawable.userphoto); Comment comment = new Comment(comment_content,uid,usphoto,uname); commentReference.setValue(comment).addOnSuccessListener(new OnSuccessListenerlt;Voidgt;() { @Override public void onSuccess(Void aVoid) { showMessage("comment added"); editTextComment.setText(""); btnAddComment.setVisibility(View.VISIBLE); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { showMessage("fail to add comment : " e.getMessage()); } }); } } }); // now we need to bind all data into those views // firt we need to get post data // we need to send post detail data to this activity first ... // now we can get post data // 게시글 사진 백지 케이스 postImage = getIntent().getExtras().getString("postImage") ; if(postImage!=null){ Glide.with(this).load(postImage).into(imgPost); } else{ Glide.with(this).load(R.drawable.whitepaper).into(imgPost); } String postTitle = getIntent().getExtras().getString("title"); txtPostTitle.setText(postTitle); String userpostImage = getIntent().getExtras().getString("userPhoto"); if (userpostImage!=null){ Glide.with(this).load(userpostImage).into(imgUserPost); } else { Glide.with(this).load(R.drawable.userphoto).into(imgUserPost); } String postDescription = getIntent().getExtras().getString("description"); txtPostDesc.setText(postDescription); // set comment user image if (firebaseUser.getPhotoUrl()!=null){ Glide.with(this).load(firebaseUser.getPhotoUrl()).into(imgCurrentUser); } else{ Glide.with(this).load(R.drawable.userphoto).into(imgCurrentUser); } // get post key PostKey = getIntent().getExtras().getString("postKey"); String date = timestampToString(getIntent().getExtras().getLong("postDate")); txtPostDateName.setText(date); // get post uid UId = getIntent().getExtras().getString("userId"); // ini Recyclerview Comment iniRvComment(); } private void beginDelete() { DatabaseReference db = FirebaseDatabase.getInstance().getReference(); Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").equalTo("1635677993574"); queryByTimestamp.get().addOnCompleteListener(new OnCompleteListenerlt;DataSnapshotgt;() { @Override public void onComplete(@NonNull Tasklt;DataSnapshotgt; task) { if(task.isSuccessful()){ for (DataSnapshot ds : task.getResult().getChildren()){ ds.getRef().removeValue(); Toast.makeText(PostDetailActivity.this,"게시글이 삭제되었습니다.",Toast.LENGTH_SHORT).show(); } } else{ Log.d("TAG",task.getException().getMessage()); Toast.makeText(PostDetailActivity.this,"게시글이 삭제안되었습니다.",Toast.LENGTH_SHORT).show(); } } }); } public void linearOnClick(View v) { imm.hideSoftInputFromWindow(et.getWindowToken(), 0); } private void iniRvComment() { RvComment.setLayoutManager(new LinearLayoutManager(this)); DatabaseReference commentRef = firebaseDatabase.getReference(COMMENT_KEY).child(PostKey); commentRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { listComment = new ArrayListlt;gt;(); for (DataSnapshot snap:dataSnapshot.getChildren()) { Comment comment = snap.getValue(Comment.class); listComment.add(comment) ; } commentAdapter = new CommentAdapter(getApplicationContext(),listComment); RvComment.setAdapter(commentAdapter); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } }); } private void showMessage(String message) { Toast.makeText(this,message,Toast.LENGTH_LONG).show(); } private String timestampToString(long time) { Calendar calendar = Calendar.getInstance(Locale.ENGLISH); calendar.setTimeInMillis(time); String date = DateFormat.format("yyyy-MM-dd",calendar).toString(); return date; }
}
Спасибо, что ответили мне
Ответ №1:
Ваша timeStamp
собственность-это число, а не строка.
"timeStamp" : 1635677993574
Поэтому, чтобы решить эту проблему, пожалуйста, измените следующий запрос:
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").equalTo("1635677993574");
Для:
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").equalTo(1635677993574);
Чтобы на самом деле искать число, а не строку. Видите, здесь нет двойных кавычек?
Комментарии:
1. Это работает! Спасибо!