【问题标题】:Deleting Firebase data after a certain time一段时间后删除 Firebase 数据
【发布时间】:2016-12-23 18:19:11
【问题描述】:

我一直在努力使这项工作从

How to delete firebase data after "n" days

但它不适合我。

这就是我正在做的,

在我的“A”活动中,我有一个按钮可以保存这块数据,并带有一个保存时间戳值的“timeStamp”子项。 (.setValue(ServerValue.TIMESTAMP);)

按下按钮后,数据保存成功。然后,它开始下一个活动,我们在那里等待。

但不是在“30”天后删除,而是立即删除。

我有一个方法与 Frank 的答案完全一样

long cutoff = new Date().getTime() - TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS);
    Query oldBug = mDatabase.orderByChild("timeStamp").endAt(cutoff);
    oldBug.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot itemSnapshot: snapshot.getChildren()) {
                itemSnapshot.getRef().removeValue();
            }
        }

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

但它不会在发布一段时间后立即删除它。

谢谢。

编辑:

【问题讨论】:

  • 当我运行您发布的代码时,它的行为符合预期。导出并发布显示结构和时间戳值的数据库片段。
  • @qbix 谢谢你,我把我的数据图片放在上面的问题编辑下。
  • 我怀疑引用 mDatabase 设置不正确。发布定义它的代码。
  • @qbix private DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();作为全局变量

标签: android firebase firebase-realtime-database


【解决方案1】:

orderByChild() 排序方法非常宽容。被排序的子项不需要具有具有指定字段名称的成员。 documentation 解释说这些孩子被分配了一个空值并出现在排序的第一位。因此,如果用于创建查询的引用位置不正确,查询不会失败,而是通常会返回该位置的所有子节点。

您使用mDatabase 创建了您的oldBug 查询,其中:

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();

这个级别太高了。应该是:

 Query oldBug = mDatabase.child("Users").orderByChild("timeStamp").endAt(cutoff);

【讨论】:

  • 谢谢你,成功了!顺便说一句,我有一个小问题。如何获取它以便实时删除?
  • 您必须解释“实时”是什么意思。
  • 例如,如果我设置5分钟后删除数据,它应该在5分钟后删除数据。不到 5 分钟,直到刷新。
【解决方案2】:

我认为您可能会考虑创建一个具有时间戳和日期的新子项,以便在查询日期和时间时可以引用它。这样您就不必担心不正确的值,并且可以确保删除正确的数据。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    相关资源
    最近更新 更多