Java数据模型对象中的Firebase ServerValue.TIMESTAMP

时间:2016-04-16 00:27:55

标签: android firebase

我是Firebase的新手,到目前为止我一直非常喜欢它。我遇到了问题;我正在使用类似于教程大纲的FirebaseListAdapter:https://github.com/firebase/AndroidChat

要使用FirebaseListAdapter,我需要使用数据模型对象(以使自动绑定工作得很好)。问题是我还想保留该模型对象的时间戳值,并且我想从Firebase服务器获取时间戳。

我目前无法使用的是类DataModelObject(类似于演示示例中的com.firebase.androidchat.Chat),其构造函数如下:

DataModelObject(String data1, String data2, Map enQTimeStamp)

然后我尝试使用这样:

DataModelObject dmo = new DataModelObject ("foo", "bar", ServerValue.TIMESTAMP);
myFirebaseRef.push().setValue(dmo);

当我尝试运行该代码时,这会导致JsonMappingException。我在这里找到了一个代码片段:

https://www.firebase.com/blog/2015-02-11-firebase-unique-identifiers.html

但值得注意的是,在Android代码示例的第4行,这将导致编译时错误(因为他试图将ServerValue.TIMESTAMP放入Map中,而TIMESTAMP是Map本身)

执行此操作并保持与FirebaseListAdapter兼容的正确方法是什么?

6 个答案:

答案 0 :(得分:19)

这听起来类似于这个问题:When making a POJO in Firebase, can you use ServerValue.TIMESTAMP?

当创建用于存储/检索除默认空构造函数之外的数据的POJO时,我通常使用类似于此的构造函数:

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);
       this.timestampCreated = timestampNow;
}

确保为HashMap包含一个getter&lt;&gt;用于存储时间戳:

public HashMap<String, Object> getTimestampCreated(){
    return timestampCreated;
}

然后使用@Exclude批注创建一个getter,您可以在代码中使用该getter来获取时间戳的值(如果需要)。 @Exclude注释将导致Firebase忽略此getter而不查找相应的属性

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

答案 1 :(得分:11)

我是这样做的

//member variable
Object createdTimestamp;

public YourConstructor(){
    createdTimestamp = ServerValue.TIMESTAMP
}

@Exclude
public long getCreatedTimestampLong(){
    return (long)createdTimestamp;
}

答案 2 :(得分:3)

您的db对象应包含以下内容:

public class FirebaseDbObject {

    private final Object timestamp = ServerValue.TIMESTAMP;

    //........
    //........

    Object getTimestamp() {
        return timestamp;
    }

    @Exclude
    public long timestamp() {
        return (long) timestamp;
    }

}

这将为您的对象添加一个名为“timestamp”的额外字段。

修改 MobileMon 发布的答案不完全正确,因为它没有getter方法。这是完整而正确的答案。

答案 3 :(得分:0)

Kotlin提供了一种通过数据类实现此目的的简便方法。您可以像

一样创建它
data class FirebaseRequestModel(
        var start_time: Any = ServerValue.TIMESTAMP,
        var stop_time: Long = 0,
        var total_time: Long = 0,
)

直接使用

val firebaseModel = FirebaseRequestModel()
firebaseRef.setValue(firebaseModel)

这将从数据类中获取默认值。

甚至你可以通过

发起你自己的价值观
val firebaseModel = FirebaseRequestModel(ServerValue.TIMESTAMP, 2134, 0)
firebaseRef.setValue(firebaseModel)

答案 4 :(得分:0)

与Urgurcan的答案类似,但是更简洁一些,因此调用方在getTimestamp与timestamp之间进行猜测就不会有麻烦。

public class FirebaseDbObject {

    private Object timestamp = ServerValue.TIMESTAMP;

    //........
    //........
    @PropertyName("timestamp")
    Object getRawTimestamp() {
        return timestamp;
    }

    @Exclude
    public long getTimestamp() {
        return (long) timestamp;
    }

}

答案 5 :(得分:-1)

你可以这样做:

public class MyTimeStamp {
    private Object timestamp;

    public MyTimeStamp() {

    }

    public Object getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Object timestamp) {
        this.timestamp = timestamp;
    }
}

所以:

public static void start(Context context) {
    MyTimeStamp timeStamp = new MyTimeStamp();
    timeStamp.setTimestamp(ServerValue.TIMESTAMP);

    Log.d(TAG, "start: ", timeStamp.getTimestamp().toString());
}