英文:
How to retrieve time stamp from Firebase child Android
问题
以下是翻译好的内容:
我正在创建一个社交应用,当有人上传帖子时,上传帖子的时间也被记录下来。
我想要获取帖子上传的日期和时间,并以适当的形式展示给用户。例如,如果是在2小时前上传的,它将显示为"2小时前",而不是完整的上传日期和时间,或上传日期的时间戳。那么,我应该如何展示它,哪种方式最简单?
这段代码:
Post post = dataSnapshot.getValue(Post.class);
dateAdded.setText(post.getDate_time());
我得到了这个错误:
java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法'java.lang.String com.example.gone.Model.Post.getDate_time()'
所以,如果有人知道如何实现这个,请帮助我一下,谢谢。
编辑---
我想要显示日期/时间的方法 -
private void getDate(TextView dateAdded) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Posts").child("date_time");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Post post = dataSnapshot.getValue(Post.class);
dateAdded.setText(post.getDate_time());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
Post类:
private String date_time;
public String getDate_time() {
return date_time;
}
public void setDate_time(String date_time) {
this.date_time = date_time;
}
public Post(String date_time) {
this.date_time = date_time;
}
JSON节点:
"Posts" : {
"-MJ-VvX8zPdt2DY0pVqb" : {
"date_time" : "01-10-2020 22:17:43",
"description" : "",
"postid" : "-MJ-VvX8zPdt2DY0pVqb",
"postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602031430356.null?alt=media&token=dc7c4a5c-d652-44be-bb2a-28283964da1e",
"publisher" : "gIt685Xex8eZaPBSsbcPbU1S5V93"
},
// 其他帖子的信息...
}
英文:
I am creating a social app and when someone uploads a post the time they uploaded the post is also uploaded.
I want to get the date and time it was uploaded and show it to the user in a proper form. For example if it was uploaded 2 hours ago it will say 2hr instead of the entire date and time it was uploaded or the time stamp of the uploaded date. So how do I show it and which was is easiest ?
This code:
Post post = dataSnapshot.getValue(Post.class);
dateAdded.setText(post.getDate_time());
I get this error:
> java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.gone.Model.Post.getDate_time()' on a null object reference
So if someone has a way of doing this can someone please help me ? Thanks
EDIT ---
The method where I want to show the date/time -
private void getDate(TextView dateAdded) {
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Posts").child("date_time");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//dateAdded.setText((CharSequence) dataSnapshot.child("date_time"));
Post post = dataSnapshot.getValue(Post.class);
dateAdded.setText(post.getDate_time());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
Post.class:
private String date_time;
public String getDate_time() {
return date_time;
}
public void setDate_time(String date_time) {
this.date_time = date_time;
}
public Post(String date_time) {
this.date_time = date_time;
}
JSON node:
"Posts" : {
"-MJ-VvX8zPdt2DY0pVqb" : {
"date_time" : "01-10-2020 22:17:43",
"description" : "",
"postid" : "-MJ-VvX8zPdt2DY0pVqb",
"postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602031430356.null?alt=media&token=dc7c4a5c-d652-44be-bb2a-28283964da1e",
"publisher" : "gIt685Xex8eZaPBSsbcPbU1S5V93"
},
"-MJ-qP4mKkkXCTGQeqhq" : {
"date_time" : "06-10-2020 22:17:43",
"description" : "",
"postid" : "-MJ-qP4mKkkXCTGQeqhq",
"postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602037062255.null?alt=media&token=5fde471b-f794-4376-8250-18c0893c716e",
"publisher" : "gIt685Xex8eZaPBSsbcPbU1S5V93"
},
"-MJUqKzwnZfC0cVRRohI" : {
"dateAdded" : "12-10-2020 22:45:41",
"date_time" : "1602557141467",
"description" : "",
"postid" : "-MJUqKzwnZfC0cVRRohI",
"postimage" : "https://firebasestorage.googleapis.com/v0/b/gone-b14f5.appspot.com/o/posts%2F1602557139321.null?alt=media&token=06af1115-481a-4c0f-8ba7-3bef13da3989",
"publisher" : "J51XZDETvNT86eCLtqU5XHUzEWu2"
}
}
答案1
得分: 1
date_time
不是Posts
的直接子项。请将date_time
替换为-MJ-VvX8zPdt2DY0pVqb
。
尝试如下:
DatabaseReference reference = FirebaseDatabase
.getInstance()
.getReference()
.child("Posts")
.child("-MJ-VvX8zPdt2DY0pVqb");
更新:
要显示所有帖子,您需要使用RecyclerView。
这里是从Firebase Quickstart 中复制的代码。
Query postsQuery = FirebaseDatabase
.getInstance().getReference().child("Posts").limitToFirst(100);
FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Post>()
.setQuery(postsQuery, Post.class)
.build();
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {
@Override
public PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
return new PostViewHolder(inflater.inflate(R.layout.item_post, viewGroup, false));
}
@Override
protected void onBindViewHolder(PostViewHolder viewHolder, int position, final Post model) {
// model.date
}
};
mRecycler.setAdapter(mAdapter);
更新 2:
要显示时间:
// 如果date_time是Long类型,例如:1602557141467
val time = 1602557141467
// 如果date_time是String类型,例如:01-10-2020 22:17:43
val time = SimpleDateFormat(
"dd-MM-yyyy HH:mm:ss",
Locale.getDefault()
).parse("01-10-2020 22:17:43")?.time ?: 0
val deltaTime = Date().time - time
val minutes = (deltaTime / (60 * 1000)).toInt() % 60
val hours = (deltaTime / (60 * 60 * 1000)).toInt() % 24
val days = (deltaTime / (24 * 60 * 60 * 1000)).toInt()
val result = buildString {
if (days != 0) append("${days}d ")
if (hours != 0) append("${hours}h ")
if (minutes != 0) append("${minutes}m")
}
英文:
date_time
is not direct child of Posts
. Instead of date_time
paste -MJ-VvX8zPdt2DY0pVqb
.
Try like that:
DatabaseReference reference = FirebaseDatabase
.getInstance()
.getReference()
.child("Posts")
.child("-MJ-VvX8zPdt2DY0pVqb");
Update:
To show all posts you need RecyclerView.
Here code that copied from Firebase Quickstart.
Query postsQuery = FirebaseDatabase
.getInstance().getReference().child("Posts").limitToFirst(100);
FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<Post>()
.setQuery(postsQuery, Post.class)
.build();
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(options) {
@Override
public PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
return new PostViewHolder(inflater.inflate(R.layout.item_post, viewGroup, false));
}
@Override
protected void onBindViewHolder(PostViewHolder viewHolder, int position, final Post model) {
// model.date
});
}
};
mRecycler.setAdapter(mAdapter);
Update 2:
To show time:
// if date_time is Long like: 1602557141467
val time = 1602557141467
// if date_time is String like: 01-10-2020 22:17:43
val time = SimpleDateFormat(
"dd-MM-yyyy HH:mm:ss",
Locale.getDefault()
).parse("01-10-2020 22:17:43")?.time ?: 0
val deltaTime = Date().time - time
val minutes = (deltaTime / (60 * 1000)).toInt() % 60
val hours = (deltaTime / ( 60 * 60 * 1000)).toInt() % 24
val days = (deltaTime / ( 24 * 60 * 60 * 1000)).toInt()
val result = buildString {
if (days != 0) append("${days}d ")
if (hours != 0) append("${hours}h ")
if (minutes != 0) append("${minutes}m")
}
答案2
得分: 0
我使用Gson来转换我的数据,在build.gradle中:
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}
在我的代码中:
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(dataSnapshot.getValue());
Post post = gson.fromJson(jsonElement, Post.class);
dateAdded.setText(post.getDate_time());
请记得让你的Post类实现Serializable接口,以在运行时获得更好的结果:
import java.io.Serializable;
public class Post implements Serializable{}
因为某种原因,直接在Firebase中进行操作会失败。
英文:
I use Gson for convert my data, in build.gradle:
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}
In my code:
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(dataSnapshot.getValue());
Post post = gson.fromJson(jsonElement, Post.class);
dateAdded.setText(post.getDate_time());
Remember make your Post class Serializable to have better results in runtime
import java.io.Serializable;
public class Post implements Serializable{}
For some reason doing it direct with Firebase fails
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论