我正在尝试使用时间戳将旧邮件删除到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存在多个消息(例如)。
但我仍然没有找到如何只删除我需要的消息。
我怎样才能使用我的数据库?
答案 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。比调用描述的功能。工作
如果有另一种方法来创建数据库结构,使删除所有用户的旧消息更容易让我知道... 例如,尝试创建一个标识一年中每一天的时间戳的节点可能会更好吗?