在firebase实时数据库中按时间戳删除帖子

Posted

技术标签:

【中文标题】在firebase实时数据库中按时间戳删除帖子【英文标题】:in firebase realtime database delete post by timestamp 【发布时间】:2021-12-15 11:48:17 【问题描述】:

It is my Realtime Database data

 "Posts" : 
"-MCCtOfEcs-t8OhKAj_R" : 
  "description" : "",
  "picture" : "https://firebasestorage.googleapis.com/v0/b/instagram-c0686.appspot.com/o/blog_images%2Fimage%3A22222?alt=media&token=eb7ffc1f-f7bd-4ab7-a108-5baf92e3ef47",
  "postKey" : "-MCCtOfEcs-t8OhKAj_R",
  "timeStamp" : 1594739760019,
  "title" : "",
  "userId" : "1tXK0R5B9uOWyAbzlZMEIs6axHo1"
,
"-MCCtPZxoFEChRczT9nY" : 
  "description" : "",
  "picture" : "https://firebasestorage.googleapis.com/v0/b/instagram-c0686.appspot.com/o/blog_images%2Fimage%3A22222?alt=media&token=c92b64ff-c2f6-4076-949a-b176253f0497",
  "postKey" : "-MCCtPZxoFEChRczT9nY",
  "timeStamp" : 1594739763718,
  "title" : "",
  "userId" : "1tXK0R5B9uOWyAbzlZMEIs6axHo1"
,

我想使用 equalTo timeStamp 变量删除帖子。所以我做了一个代码。

Query fquery =FirebaseDatabase.getInstance().getReference("Posts").orderByChild("timeStamp").equalTo("1615602220595");

但我不知道为什么不工作.. 当我这样做时

Query fquery =FirebaseDatabase.getInstance().getReference("Posts").orderByChild("postKey").equalTo("-MCCtOfEcs-t8OhKAj_R");

成功了。

这是完整的代码。

public class PostDetailActivity extends AppCompatActivity 

ImageView imgPost,imgUserPost,imgCurrentUser;
TextView txtPostDesc,txtPostDateName,txtPostTitle;
EditText editTextComment;
Button btnAddComment;
String PostKey;
FirebaseAuth firebaseAuth;
FirebaseUser firebaseUser;
FirebaseDatabase firebaseDatabase;
RecyclerView RvComment;
CommentAdapter commentAdapter;
List<Comment> 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 OnSuccessListener<Void>() 
                    @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 OnSuccessListener<Void>() 
                    @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() 

    StorageReference picRef = FirebaseStorage.getInstance().getReferenceFromUrl(postImage);
    picRef.delete()
            .addOnSuccessListener(new OnSuccessListener<Void>() 
                @Override
                public void onSuccess(Void aVoid) 
                    //image deleted, now delete database
                    Query fquery =FirebaseDatabase.getInstance().getReference("Posts").orderByChild("timeStamp").equalTo("1615602220595");
                    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();
                
            );



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 ArrayList<>();
            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;



【问题讨论】:

请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。还请注明~~~是什么? 我编辑了json文件和~~~东西。 【参考方案1】:

如果要删除“帖子”节点中存在的第一个节点 (-MCCtOfEcs-t8OhKAj_R),请注意不需要执行查询。由于节点的键与postKey字段的值相同,那么你应该简单地使用以下代码行:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
db.child("Posts").child("-MCCtOfEcs-t8OhKAj_R")).removeValue();

我还建议您在removeValue() 操作中附加一个完整的侦听器,以查看是否有问题。如果您没有适当的规则,则会抛出异常。

编辑:

根据你上一条评论:

我想删除具有旧时间戳的实例。

在这种情况下,您确实需要使用查询。例如,如果您需要删除特定时间戳之前的子项,则使用Query#endAt() 方法,该方法:

创建一个查询,限制为仅返回值小于或等于给定值的子节点,使用给定的 orderBy 指令或优先级作为默认值,此外仅返回键小于或等于给定键的子节点.

这是一个工作示例:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
Query queryByTimestamp = db.child("Posts").orderByChild("timeStamp").endAt(1615602220595);
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();
            
         else 
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        
    
);

此查询的结果将是删除1615602220595 之前存在的所有子代。

【讨论】:

感谢您的建议。但是我可以问一下时间戳问题吗?? 怎么样? 我想删除具有旧时间戳的实例。但是我的数据库结构是这样的->“Posts”:“postkey1”:“timeStamp”:99,,“postkey2”:“timeStamp”:100,,我无法接近timeStamp,因为它们有父部分postkey1、postkey2有不同。所以我不能使用 orderbychild("timeStamp") 来收集 timeStamp 实例。你知道通过忽略 postkeypart 来处理 timeStamp 的方法吗? 在这种情况下,请查看我更新的答案。现在还好吗? 非常感谢!!但它不工作..我添加 Toastmaketext 是否工作,但没有一个包括 logcat 消息不显示。

以上是关于在firebase实时数据库中按时间戳删除帖子的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Flutter 中的 Firebase 实时数据库中按 categoryId 获取产品?

Firebase 实时数据库 - DatabaseReference.push().getKey() 是一个时间戳

如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?

尝试将帖子写入 Firebase 实时数据库时遇到无法识别的选择器发送到实例错误”

Firebase 实时数据库能否有效地循环浏览数十亿条帖子并由发布它们的用户检索?

在 Firebase 实时数据库中实现用户名(swift 4)