【发布时间】:2020-08-31 03:16:35
【问题描述】:
我的实时数据库已存储超过 1GB 的数据,因此为了修剪、节省存储空间和优化日常使用,我每月运行一次例程以删除旧的和不相关的数据。
它是这样的:
App.getDatabaseInstance().getReference("store/orders/historic/").orderByChild("creationTs").limitToLast(500).endAt(System.currentTimeMillis() - (90L * ONE_DAY_MILLIS)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot historicDs : dataSnapshot.getChildren()) {
historicDs.getRef().removeValue();
}
cleanHistoricBranch();
} else
System.out.println("FINISHED!!!");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
查询在数据库中的数千个节点(不是数百万个)上运行,但需要 HOURS 才能完成。我想问题是必须一个接一个地下载和删除数据
我尝试了不同的方法,但效果不佳。
App.getDatabaseInstance().getReference("store/orders/historic/").orderByChild("creationTs").limitToLast(500).endAt(System.currentTimeMillis() - (90L * ONE_DAY_MILLIS)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
dataSnapshot.getRef().removeValue(); //deletes the whole branch, even the nodes that doesnt match the query.
cleanHistoricBranch();
} else
System.out.println("FINISHED!!!");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
那么有没有人有更好的方法来修剪数据库层次结构中的大量节点?每个节点的数据很少,但我有大约 20 到 5 万个候选节点要删除。
【问题讨论】:
标签: android firebase firebase-realtime-database