问题描述
我正在尝试在Cloud Firestore中添加文档,但是我需要服务器timestamp
来添加文档.使用正确的timestamp
将文档成功添加到集合中.我在添加带有警告对话框的文档.但是,当我返回到活动应用程序时,由于以下错误而终止:
I'm trying to add a document in Cloud Firestore, but I need the server timestamp
for adding the document. Documents are successfully added in the collection with the correct timestamp
. I'm adding the document with an alert dialog. But when I'm returning to my activity app terminates with following errors:
为了显示文档,我正在使用以下查询
For showing document's I'm using following query
Query query= FirebaseFirestore.getInstance()
.collection("Users")
.document(user.getUid())
.collection("friends")
.orderBy("timestamp", Query.Direction.DESCENDING);
我的课在这里
public class UserLight{
protected String name;
protected String email;
protected String uid;
protected Float rating;
protected String photoUrl;
protected long timestamp;
public UserLight(){
}
//other getters and setters
@Exclude
public long getTimestampLong(){
return timestamp;
}
public FieldValue getTimestamp() {
return FieldValue.serverTimestamp();
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp.toDate().getTime();
}
}
用于处理查询快照的代码
Code that deals with the snapshot from the query
Query query= FirebaseFirestore.getInstance()
.collection("Users")
.document(user.getUid())
.collection("friends")
.orderBy("timestamp", Query.Direction.DESCENDING);
PagedList.Config config = new PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPrefetchDistance(5)
.setPageSize(10)
.build();
FirestorePagingOptions<UserLight> options = new FirestorePagingOptions.Builder<UserLight>()
.setLifecycleOwner(this)
.setQuery(query, config, UserLight.class)
.build();
mAdapter = new FirestorePagingAdapter<UserLight, ItemFriendViewHolder>(options) {
@NonNull
@Override
public ItemFriendViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ItemFriendViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.rc_item_friend, parent, false));
}
@Override
protected void onBindViewHolder(@NonNull ItemFriendViewHolder holder, int position, @NonNull final UserLight userLight) {
holder.txtName.setText(userLight.getName());
GlideApp.with(holder.context).load(userLight.getPhotoUrl()).into(holder.avata);
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(FriendListActivity.this,FinalChatActivity.class);
intent.putExtra("Friend", (Serializable) userLight);
startActivity(intent);
}
});
}
@Override
protected void onLoadingStateChanged(@NonNull LoadingState state) {
switch (state) {
case LOADING_INITIAL:
case LOADING_MORE:
// Do your loading animation
mSwipeRefreshLayout.setRefreshing(true);
break;
case LOADED:
// Stop Animation
mSwipeRefreshLayout.setRefreshing(false);
break;
case FINISHED:
//Reached end of Data set
mSwipeRefreshLayout.setRefreshing(false);
break;
case ERROR:
retry();
break;
}
}
@Override
protected void onError(@NonNull Exception e) {
super.onError(e);
mSwipeRefreshLayout.setRefreshing(false);
}
};
recyclerView.setAdapter(mAdapter);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
mAdapter.refresh();
}
});
插入后的文档
推荐答案
代码中的问题是UserLight
类中的时间戳字段类型与timestamp
属性的类型不匹配在数据库中.请参见,在您的UserLight
类中,时间戳字段的类型为long
,而在数据库中的时间戳字段的类型基本上为Date
或Timestamp
.请注意,两者必须匹配.
The problem in your code is the fact that the type of your timestamp field inside your UserLight
class dosn't match the type of your timestamp
property in the database. See, in your UserLight
class the timestamp field is of type long
, which is basically a number while in the database is of type Date
or Timestamp
. Please note that both must match.
因为在Cloud Firestore中保存日期的正确方法是使用Date
或Timestamp
类,要解决此问题,只需将模型类中的时间戳字段的类型更改为Date
,如我从以下帖子中得到的答案:
Because the correct way of holding dates in Cloud Firestore is to use the Date
or Timestamp
class, to solve this, simply change type of your timestamp field in your model class to be Date
, as explained in my answer from the following post:
这篇关于在Firestore中获取服务器时间戳时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!