Firebase Android ServerValue.Timestamp Map to Long

时间:2017-04-26 15:43:38

标签: android firebase firebase-realtime-database

我知道这是旧的,我可以在这里找到一些关于此的热门帖子。但是我发誓我仍然被卡住了,我真的不明白每个答案都贴了,已经7个小时了,请善待并提供给我答案,这就是杀了我。

为了使答案清晰直接,我决定从其他帖子中发布一个我认为可能是答案的答案,但我只是不知道如何将其应用到我的代码中。

所以,我使用POJO:

HashMap<String, Object> timestamp = new HashMap<>();

public Reservation(String rid,Map timestamp, String status) {
    this.rId = rid;
    this.timestamp = timestamp;
    this.status = status;
}

 public Map getTimestamp() {
   return timestamp;
 }

这就是我写给db的方式:

 private void SendReservation() {
    final String key = mDatabaseRes.child("Reservations").push().getKey();

    final Reservation reservation = new Reservation(MainActivity.currUser.getUID(),ServerValue.TIMESTAMP,"pending");         

    mDatabaseRes.child("Reservations").child(key).setValue(reservation, new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference reference) {
            if (databaseError != null) {

                Log.e("Database ERROR", "Failed to write message", databaseError.toException());
            } else {
                Toast.makeText(getApplicationContext(),
                        "success"
                        , Toast.LENGTH_LONG).show();
            }
        }
    });


}

直到现在我成功写入db,时间戳也显示时间14090282xxxx(到现在为止似乎正确),读取时间戳值时出现错误,例如“无法反序列化长到映射”的快照获取值:

reservationList.clear();
for (DataSnapshot dsp : dataSnapshot.getChildren()) {
    reservationList.add(dsp.getValue(Reservation.class)); //add result into array list

}

好的,正如我所说,让我从kevin o'neill那里挑选并展示一个答案,我如何申请我的: 这是link

Param param1;
Param param2;
HashMap<String, Object> timestampCreated;

//required empty constructor
public DataObject(){}

    public DataObject(Param param1, Param param2) {
           this.param1 = param1;
           this.param2 = param2;
           HashMap<String, Object> timestampNow = new HashMap<>();
           timestampNow.put("timestamp", ServerValue.TIMESTAMP);
    }
    public HashMap<String, Object> getTimestampCreated(){
       return timestampCreated;
    }

    @Exclude
    public long getTimestampCreatedLong(){
       return (long)timestampCreated.get("timestamp");
    }

这是一些投票的接受答案,让我感到困惑的是时间戳和时间戳之间的联系是什么? ,构造函数也没有像我那样的时间戳。

我需要添加到我的代码中以使其获得正确的结果。

5 个答案:

答案 0 :(得分:1)

想法是,当您在数据库中设置TIMESTAMP时,将其设置为map,当您检索它时,将其检索为Long

因此,为了获得正确的TIMESTAMP,您需要将listener放在正确的位置,然后从TIMESTAMP中提取dataSnapshot,如下所示:

Long timeStampLong = (Long) dataSnapshot.child("timestamp").getValue();

你需要使用一种方法来转换它:

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

如果您希望从对象中获取TIMESTAMP而不是您需要在模型中使用public setterspublic getters,请执行以下操作:

public void setTimeStamp(Map<String, String> timeStamp) {
    this.timeStamp = timeStamp;
}
public Map<String, String> getTimeStamp() {
    return timeStamp;
}

希望它有所帮助。

答案 1 :(得分:1)

经过14个小时后,我终于找到了解决方案。

我的灵感来自here

由于消息来源没有任何解释,我会根据我的情况在此重写一些解释。

首先,我删除了我班外的所有serverValue.timeStamp,我也将其从构造函数中删除。

然后我添加此变量成员Long creationDate;

并添加公共getter,以便它可以将时间戳写入DB:

 public java.util.Map<String, String> getCreationDate() {
    return ServerValue.TIMESTAMP;
}

最后要做的是添加方法以检索值

@Exclude
public Long getCreationDateLong() {
    return creationDate;
}

那就是它,我测试过并且工作过,我希望它也可以帮助别人。

答案 2 :(得分:1)

对于Kotlin用户,想法是相同的。设置TIMESTAMP时,将其设置为Map,检索时,将其恢复为long

因此,为了获得正确的TIMESTAMP,您需要在正确的位置附加listener,然后像这样从TIMESTAMP中提取dataSnapshot

val timestamp = dataSnapshot.child("timestamp").getValue() as Long

然后,您需要使用一种方法将其转换为:

fun getTimeDate(timeStamp: Long): String? {
    return try {
        val dateFormat: DateFormat = getDateTimeInstance()
        val netDate = Date(timeStamp)
        dateFormat.format(netDate)
    } catch (e: Exception) {
        e.message
    }
}

如果要从对象中获取TIMESTAMP,而不是需要在模型中使用,请在timestamp字段中输入以下内容:

val timestamp = emptyMap<String, String>()

答案 3 :(得分:0)

如果你问我,那是最简单的。

long serverTime = Timestamp.now().getSeconds();

可以在任何地方使用。

答案 4 :(得分:0)

我在模型类的date(timeStamp)字段中使用了 Object 类型。够了。

public class Post {
    private String message;
    private Object timeStamp; //<<<<<<<<<<<<<<<<<<<<< Object 

    public Post() {
    }

    public Post(String message, Object timeStamp) {
        this.message = message;
        this.timeStamp = timeStamp;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getTimeStamp() {
        return timeStamp;
    }

    public void setTimeStamp(Object timeStamp) {
        this.timeStamp = timeStamp;
    }
}

写入Firebase时:

FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("Posts");

Post newPost = new Post("merhaba", ServerValue.TIMESTAMP);
ref.push().setValue(newPost);

从Firebase读取数据时:

FirebaseDatabase db = FirebaseDatabase.getInstance();
DatabaseReference ref = db.getReference("Posts");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        postArrayList.clear();
        for (DataSnapshot data : dataSnapshot.getChildren()){
            Post m = data.getValue(Post.class);
            postArrayList.add(m);
        }
        adapterPost.notifyDataSetChanged();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

读取timeStampValue时:

Post post = postArrayList.get(position);
String timeStampValue= new SimpleDateFormat("MM/dd/yyyy").format(new Date((long) post.getTimeStamp()));