我是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兼容的正确方法是什么?
答案 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());
}