在一定时间后自动更改Firebase Firestore中的字段值

时间:2018-08-22 02:09:35

标签: android firebase firebase-realtime-database

我的数据库结构是这样的:

"users": {
"PXZwwGvu0lNwJeov8CMMrETnzVx1": {
      "name": "Ada Lovelace",
      "timestamp" : July 4, 2018 at 4:31:27 PM UTC+5:45
      "happy": true,
    }

"PXZwwGvu0lNwJeov8CMMrETnzVx2": {
      "name": "Charles Babbage",
      "timestamp" : July 5, 2018 at 5:29:15 PM UTC+5:45
      "happy": true,
    }
"PXZwwGvu0lNwJeov8CMMrETnzVx3": {
      "name": "Elon Musk",
      "timestamp" : July 7, 2018 at 9:21:37 PM UTC+5:45
      "happy": true,
    }
}

此处的“时间戳记”表示文档的创建时间。我想在文档创建后的一天刚好将字段“ happy”的值从true更改为false。用户可以在文档创建后关闭应用程序创建,但字段值仍应更改。 有什么办法吗?

2 个答案:

答案 0 :(得分:2)

我可能为此设置了一个Cloud Function。这是一段可在Google基础架构上运行的代码,可以与Firebase(和其他云)资源进行交互。

如果您schedule a Cloud Function to run every hour,则可以运行数据库查询来查找所有时间戳在23到24小时之间的用户,并进行更新。

在伪代码中,它看起来像这样:

var now = Date.now();
var 24hoursago = now - ...;
var 23hoursago = now - ...;
var ref = firebase.database().ref("users");
var query = ref.orderByChild("timestamp").startAt(24hoursago).end(23hoursago);
query.once("value").then(function(snapshot) {
  snapshot.forEach(function(user) {
    user.ref.update({ happy: false });
  });
});

答案 1 :(得分:1)

您可以使用Firebase JobDispatcher,它使用JobScheduler在后台运行任务,并且可以为例如24小时设置触发器,然后更新Firebase数据库子级。

例如,作业可以在创建后的24小时内仅用此行触发。

.setTrigger(Trigger.executionWindow(60*60*24,60*60*24+60))
  

该设备在没有Google设备的情况下也可以使用   播放已安装的服务,并希望在   应用。在这种情况下,该库在内部使用   AlarmManager。如果设备上提供了Google Play服务,则   它使用Google Play服务中的计划引擎。

     

提示:如果使用Google Play,它将使用AlarmManager支持<= 21的API级别   服务不可用。

对于在API级别21上运行的设备,它使用JobScheduler

提示2:如果您需要重新安排工作,可以使用此

jobFinished(your_job,true);  // this line will reschedule your job after is finished