Android Kotlin如何向Firebase实时数据库添加当前日期并实现数据存取
1. 选择存储的日期数据类型
优先选毫秒级时间戳(Long类型),优势如下:
- Firebase Realtime Database对数值类型适配性好,没有序列化/反序列化异常问题
- 后续按时间排序、筛选特定时间区间的数据操作非常方便,灵活性远高于字符串格式
- 不受时区影响,后续可以按需转成任意时区的可读日期格式
2. 更新Notifications数据类
给类新增createTime字段,类型为Long,如果需要兼容历史数据可以给字段加默认值,避免读取旧数据时崩溃:
data class Notifications( val emailA: String, val title: String, val body: String, val createTime: Long = 0 // 新增时间戳字段,默认值适配旧数据 )
3. 修改写入代码,传入当前时间戳
构造Notifications实例时,直接用System.currentTimeMillis()获取当前设备时间的毫秒戳传入即可:
val notificstionRef = rootRef.child("Notifications") val eventListener1: ValueEventListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { val recharge = amountText.getText().toString() val title = "Recharge Amount" // 构造实例时新增当前时间戳参数 val notifications = Notifications(sessionId,title,recharge, System.currentTimeMillis()) ref1.child(sessionId).setValue(notifications).addOnSuccessListener { } .addOnFailureListener{ } } override fun onCancelled(databaseError: DatabaseError) { } } notificstionRef.addListenerForSingleValueEvent(eventListener1)
可选优化:如果担心用户设备本地时间不准,可以使用Firebase服务器时间,只需要把写入时传的
System.currentTimeMillis()换成ServerValue.TIMESTAMP,对应数据类的createTime字段类型改为Any即可,读取到的还是Long类型的时间戳,使用方式不变。
4. 修改读取代码,获取并使用日期字段
读取时可以直接拿到Long类型的时间戳,需要显示为人类可读格式的话,加个简单的转换方法即可:
val rootRef = FirebaseDatabase.getInstance().reference val userRef = rootRef.child("Notifications").child(sessionId) val valueEventListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { val title = dataSnapshot.child("title").getValue(String::class.java) val body = dataSnapshot.child("body").getValue(String::class.java) // 读取时间戳字段 val createTime = dataSnapshot.child("createTime").getValue(Long::class.java) // 转成yyyy-MM-dd HH:mm:ss格式的可读字符串,格式可以按需调整 val timeStr = createTime?.let { SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(Date(it)) } ?: "无时间记录" title1Notification.setText(title) body1Notification.setText(body) // 如需展示时间,赋值到对应控件即可 // timeView.setText(timeStr) } override fun onCancelled(error: DatabaseError) { Log.d("TAG", error.getMessage()) } } userRef.addListenerForSingleValueEvent(valueEventListener)
使用SimpleDateFormat需要提前导入三个包:java.util.Date、java.text.SimpleDateFormat、java.util.Locale。
内容的提问来源于stack exchange,提问作者user17056863
相关产品推荐
相关产品推荐

