删除日期较早的邮件 - 使用MAP

时间:2016-12-12 18:01:58

标签: android firebase timestamp firebase-realtime-database

我正在尝试使用时间戳将旧邮件删除到FriendlyChat中。 我正在使用这篇文章How to delete firebase data after "n" days来尝试解决。 我遇到的问题:我的firebase数据库的代码正在删除所有消息,而不仅仅是我需要的消息。

我的firebase数据库JSON:

{
  "messages" : {
    "Bl0AiMMUXsV2H58lqoj0rO84" : {
      "-KYo1YqO9vQ4Fcc07TcU" : {
        "dateCreatedGu" : {
          "date" : 1481563061846
        },
        "name" : "nameOfUser",
        "photoUrl" : "https://lh6.g/photo.jpg",
        "text" : "h"
      },
      "-KYo1atRyY3VYxuTZRPZ" : {
        "dateCreatedGu" : {
          "date" : 1481563074335
        },
        "name" : "\"nameOfUser\"\"",
        "photoUrl" : "https://lh6.googleusercontent.com.../-photo.jpg",
        "text" : "g"
      },
      "-KYo1bQXtJNB94et25m2" : {
        "dateCreatedGu" : {
          "date" : 1481563076516
        },
        "name" : "Gus",
        "photoUrl" : "https://lh6.../photo.jpg",
        "text" : "b"
      },
      "-KYo4GmLdM0TyT_Aym0u" : {
        "dateCreatedGu" : {
          "date" : 1481563774514
        },
        "name" : "gus",
        "photoUrl" : "https://lh6.go.../photo.jpg",
        "text" : "h"
      }
    }
  }
}

我的代码片段Android:

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference("messages");


//beginn n-days
long cutoff = new Date().getTime() - TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS);

Query oldItems = mFirebaseDatabaseReference.orderByChild("timestamp").endAt(cutoff);
//

oldItems.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot itemSnapshot: snapshot.getChildren()) {
            itemSnapshot.getRef().removeValue();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

//end n-days

这里的区别是我的日期的时间戳是“ dateCreatedGu 而不是直接在邮件上,因为我使用地图来存储时间戳。

有什么问题?如何才能正确删除我需要的邮件 - 例如30天以内的邮件? 我尝试将期限从30天更改为30秒到cutoff = new Date().getTime() - TimeUnit.MILLISECONDS.convert(30, TimeUnit.SECONDS);以验证代码。

我尝试从addValueEventListener更改为添加ChildEventListener...

我知道当你没有阅读带有属性的对象但是直接阅读 属性时,会使用orderByValue。 我理解在这种情况下,最好使用orderbyKey优化代码,因为密钥在时间跳跃值期间按字母顺序存储) - 用于optimeze搜索也增加的时间戳。 我理解addChildEventListener尝试读取数据库中的每个值f存在多个消息(例如)。 但我仍然没有找到如何只删除我需要的消息。 我怎样才能使用我的数据库?

2 个答案:

答案 0 :(得分:1)

由于您嵌套了时间戳,因此需要按查询中的嵌套属性进行排序:

"false" != false

答案 1 :(得分:0)

不删除所有节点的解决方案是: 来自

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference("messages");

更改为

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference("messages/Bl0AiMMUXsV2H58lqoj0rO84");

或者这样做

Query oldItems = mFirebaseDatabaseReference.child("Bl0AiMMUXsV2H58lqoj0rO84").orderByChild("dateCreatedGu/date").endAt(cutoff);

因为代码itemSnapshot.getRef()正在返回所有消息的父节点,即" Bl0AiMMUXsV2H58lqoj0rO84"这就是为什么当你执行removeValue()方法时,你的所有消息都将被删除。您的数据库引用应该是您的消息节点下的id(我假设这是一个uid)。

Firebase团队帮我解决了这个问题。

要使用此代码,必须先调用另一个发现节点名称的函数,在本例中为节点:Bl0AiMMUXsV2H58lqoj0rO84。比调用描述的功能。工作

如果有另一种方法来创建数据库结构,使删除所有用户的旧消息更容易让我知道... 例如,尝试创建一个标识一年中每一天的时间戳的节点可能会更好吗?