在Firestore中获取服务器时间戳时出错 [英] Error in getting server timestamp in Firestore

查看:146
本文介绍了在Firestore中获取服务器时间戳时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在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:

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException ........ E/AndroidRuntime: 原因:java.lang.NullPointerException:尝试调用虚拟 方法"java.util.Date com.google.firebase.Timestamp.toDate()" 空对象引用 在com.sasam.virtuallibrary.Models.UserLight.setTimestamp(UserLight.java:103)

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException ........ E/AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Date com.google.firebase.Timestamp.toDate()' on a null object reference at com.sasam.virtuallibrary.Models.UserLight.setTimestamp(UserLight.java:103)

为了显示文档,我正在使用以下查询

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,而在数据库中的时间戳字段的类型基本上为DateTimestamp.请注意,两者必须匹配.

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中保存日期的正确方法是使用DateTimestamp类,要解决此问题,只需将模型类中的时间戳字段的类型更改为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中获取服务器时间戳时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆