База данных в реальном времени orderbyByChild(метка времени) не работает (android-java)

# #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. Это работает! Спасибо!