gpt4 book ai didi

android - 如何在 Firebase 实时数据库中使用结束日期时间

转载 作者:太空狗 更新时间:2023-10-29 16:27:25 24 4
gpt4 key购买 nike

在我们的应用程序中,保存新数据的结束日期时间也非常重要。

例如,如果写一条新消息,我希望用户只能看到它十个小时。使用 rest api 和 sql 数据库,我可以轻松地使用服务器时间(+10 小时)创建结束日期时间并将消息保存在数据库中。为用户加载消息时,我可以选择结束日期时间早于现在的所有消息。

如何使用 Firebase 实时数据库执行此操作?也许使用 Firebase Cloud Functions?我不想使用客户时间。

最佳答案

这实际上是 Cloud Functions 的一个很好的使用示例。

将消息保存到数据库时,可以使用ServerValue.TIMESTAMP自动插入 Firebase 服务器的时间戳,因此您可以执行以下操作:

public void saveMessage(String content) {
DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference("messages");

HashMap<String, Object> message = new HashMap<>();
message.put("content", content);
message.put("startTime", ServerValue.TIMESTAMP);

messagesRef.push().setValue(message);
}

然后您可以将 Cloud Functions 附加到 messages 位置以监听新数据。此函数可以执行将 10 小时添加到 startTime 值并将其保存为 endTime 返回给同一个 child 的逻辑,例如:

exports.calculateEndTime = functions.database
.ref('/messages/{messageId}').onCreate(event => {
const message = event.data.val();

// Only calculate endTime if it doesn't already exist.
if (message && !message.endTime) {
// Add 10 hours (in milliseconds) to the startTime to obtain the endTime.
const endTime = message.startTime + (10 * 3600000);

// Update the Firebase Database with the new endTime value.
return event.data.adminRef.update({
endTime: endTime
});
}
});

最后,要查询消息列表以仅获取 endTime 尚未过去的消息,您可以执行以下操作:

// Obtain the server time using the .info/serverTimeOffset value.
DatabaseReference offsetRef = FirebaseDatabase.getInstance().getReference(".info/serverTimeOffset");
offsetRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
// Calculate the estimated server time based on the offset.
double offset = snapshot.getValue(Double.class);
double estimatedServerTimeMs = System.currentTimeMillis() + offset;

// Use this server time to get the messages.
getMessages(estimatedServerTimeMs);
}

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

public void getMessages(double endTime) {
DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference("messages");

// Create a query to limit results where endTime is greater than the current time.
Query messagesQuery = messagesRef.orderByChild("endTime").startAt(endTime);

messagesRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot message : dataSnapshot.getChildren()) {
// ...
}
}

@Override
public void onCancelled(FirebaseError firebaseError) { }
});
}

这个例子首先抓取 clock skew value (from .info/serverTimeOffset)计算估计的当前服务器时间,然后在 startAt() 查询中使用它来仅返回当前时间之后带有 endTime 的消息。


可能还有其他一些方法可以解决这个问题,比如获取服务器时间戳并在保存消息时执行上述逻辑,或者甚至只是查询 startTime(使用 startAt 10 小时前)。

但是,使用 Cloud Functions 路由是确保 endTime 在服务器端计算的好方法,可以快速执行新消息的保存,并且消息实际上包含 endTime 数据库中的值。

关于android - 如何在 Firebase 实时数据库中使用结束日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47161032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com