如果我在其中使用变量,实时数据库更新方法将不起作用

Realtime databse endAt method doesn't work if I use variable in that

"Posts" : {
"-MnLFAlhayTv80FxzUfL" : {
  "description" : "",
  "picture" : "",
  "postKey" : "-M",
  "timeStamp" : 1635682139495,
  "title" : "",
  "userId" : "",
  "userPhoto" : ""
},
"-MnLFzItc050Sn0EtDho" : {
  "description" : "",
  "picture" : "",
  "postKey" : "-M",
  "timeStamp" : 1635682350531,
  "title" : "",
  "userId" : "b",
  "userPhoto" : ""
},

这是我的数据结构。当我尝试像 1635682350531 这样的 long 变量时,我将使用 orderbyChild(timeStamp).endAt() 方法编写一个删除旧 post 的代码 ->> orderbyChild(timeStamp).endAt(1635682350531l);当我将 l 添加到 1635682350531

时它起作用

并且我定义了当前时间戳变量并将其放入 endAt 方法,但它不起作用。我可能认为我没有在我的变量中添加“l”?

这是我的代码。

if (UId.equals("k")) {
        long tlong = System.currentTimeMillis(); long ttime;
        ttime = tlong - 3*24*60*60*1000;
        StorageReference picRef = FirebaseStorage.getInstance().getReferenceFromUrl(postImage);
        showMessage(String.valueOf(ttime));
        picRef.delete()
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        //image deleted, now delete database
                        DatabaseReference db = FirebaseDatabase.getInstance().getReference();
                        Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(ttime);
                        queryByTimestamp.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<DataSnapshot> 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();

                                }
                            }
                        });


                    }
                })
                .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();
                    }
                });
    }

谢谢你回答我。

当您使用以下查询时:

Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(ttime);

需要一个索引。所以很可能是以下日志语句:

Log.d("TAG", task.getException().getMessage());

产生以下错误消息:

Index not defined, add ".indexOn": "timeStamp", for path "/Posts", to the rules

要解决这个问题,您必须设置以下规则:

{
  "rules": {
    "Posts": {
      ".indexOn": "timeStamp",
      ".read": true,
      ".write": true
    }    
  }
}

为了让它发挥作用。有了这个索引,您的查询将 return 预期结果和以下代码行:

ds.getRef().removeValue();

将从数据库中删除两者 children。