如何在android中的POJO中设置和获取`ServerValue.TIMESTAMP`?

时间:2017-11-01 03:17:54

标签: java android firebase firebase-realtime-database

假设我正在使用这样的POJO:

public class Pojo {
    String name;
    //Others
    Map<String, String> time; //As this is a Map<String,String>
    //Constructors, getters, setters etc.
}

现在我希望将其上传到firebase

Button b = findViewById(R.id.button_upload);
b.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Pojo pojo = new pojo;
        pojo.setName(getName());
        pojo.setTimeStamp(ServerValue.TIMESTAMP); //Is this right?
        String id = pojoFirebaseDatabase.push().getKey();
        shortcut.setId(id);
        shortcutDatabase.child(id).setValue(pojo);
    }
}

这些对我来说都是正确的。但是当我在实时数据库中看到时,我发现其中只有一个长("time" : 123456789)。 Map<String,String>如何变为长期?

当我试图让我的pojo回来时(我正在使用Firebase-UI):

fbUIRecyclerAdapter =
    new FirebaseRecyclerAdapter<Pojo, PojoViewHolder>(myOptions) {
    @Override
    public PojoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.pojo_view, parent, false);
        return new PojoViewHolder(v);
    }

    @Override
    protected void onBindViewHolder(PojoViewHolder pView, int position, Pojo pojo) {
        pView.setName(pojo.getName());                      
        shortcutView.setTimestamp(shortcut.getTimeStamp());
    }

我得到一个例外:

com.google.firebase.database.DatabaseException: Expected a Map while deserializing, but got a class java.lang.Long

这对我来说似乎很合理。因为数据库中只有很长的数据库,但我要求Map<String, String>中有Pojo.class

那么我该如何解决这个问题呢?如何在我的Pojo对象中使用它来满足我的需求呢?

2 个答案:

答案 0 :(得分:0)

1.将地图添加到您的代码Map<String, String> time = new HashMap<>();

2.输出地图time.put("time",ServerValue.TIMESTAMP);

的值

3.设置为Pojo pojo.setTimeStamp(time);

试试这个。

    // add map
    Map<String, String> time = new HashMap<>();
    time.put("time",ServerValue.TIMESTAMP);
    // edited here ,change Pojo
    Pojo pojo = new Pojo();
    pojo.setName(getName());
    // edited here 
    pojo.setTimeStamp(time); 

答案 1 :(得分:0)

当您在Firebase数据库中设置timestamp时,将其设置为Map,当您检索时,您将其检索为Long。因此,您可以将该属性嵌套在一个更通用的HashMap<String, Object>中,它可以作为单个长值(&#34; date&#34;,&#34; longValue&#34;)进入数据库。正如您所做的ServerValue.TIMESTAMP,这是一个看起来像这样的HashMap :(&#34; date&#34;,{&#34; .sv&#34;,&#34; servertime&#34;})

要获得时间和日期,请使用以下方法重新命令:

String getTimeDate(long timeStamp){
    try{
        DateFormat dateFormat = getDateTimeInstance();
        Date netDate = (new Date(timeStamp));
        return dateFormat.format(netDate);
    }
    catch(Exception e){
        return "date";
    }
}

要获得使用以下方法重新命令您的日期:

String getDate(long timeStamp){
    try{
        DateFormat dateFormat = getDateInstance();
        Date netDate = (new Date(timeStamp));
        return dateFormat.format(netDate);
    }
    catch(Exception e){
        return "date";
    }
}