Java Firebase允许在时间戳内插入
自从我的程序启动后,我尝试在时间戳内(大约10秒)插入数据,我有以下数据结构Java Firebase允许在时间戳内插入,java,firebase,firebase-security,Java,Firebase,Firebase Security,自从我的程序启动后,我尝试在时间戳内(大约10秒)插入数据,我有以下数据结构 资料 项目 时间 时间 启动程序时,我将当前时间戳保存在time中,如下所示 firebaseRef.child("time").setValue(ServerValue.TIMESTAMP, listener); firebaseRef.child("time").addListenerForSingleValueEvent(new ValueEventListener() { @Override
- 资料
- 项目
- 时间
- 时间
time
中,如下所示
firebaseRef.child("time").setValue(ServerValue.TIMESTAMP, listener);
firebaseRef.child("time").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Long timestamp = (Long) dataSnapshot.getValue();
System.out.println(timestamp);
HashMap<String, Object> map = new HashMap<>();
map.put("time", timestamp);
firebaseRef.child("time").setValue(map, listener);
}
@Override
public void onCancelled(FirebaseError error) {
}
});
但它不起作用,我被拒绝了。我的规则有什么问题吗?其中一个问题当然是您正在初始化:
firebaseRef.child("time").setValue(ServerValue.TIMESTAMP, listener);
这将time
的值设置为long
{
"time": 1460776272703
}
但是:
HashMap<String, Object> map = new HashMap<>();
map.put("time", timestamp);
ref.child("time").setValue(map, listener);
即使这是有意的,像这样改变数据结构似乎是个坏主意。例如,在模拟器中,我很快遇到如下错误消息:
类型错误:+仅对数字和字符串进行操作
因为它试图将JSON对象(/time
在上面的第二个代码段中)作为数值计算
我的工作片段更简单:
Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/36658910");
ref.child("time").setValue(ServerValue.TIMESTAMP, listener);
/*ref.child("time").addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
Long timestamp = (Long) dataSnapshot.getValue();
System.out.println(timestamp);
dataSnapshot.getRef().setValue(timestamp);
}
public void onCancelled(FirebaseError error) { }
});*/
我这样运行它,以便对位置进行测试,然后再运行另一次,禁用初始的setValue()
,并启用侦听器来测试更新
相应的安全规则:
"time": {
".write": true,
".validate": "(!data.exists() && newData.val() == now) || newData.child('time').val() + 100000 >= now"
}
您会注意到,我有单独的案例来编写初始值(必须使用
ServerValue.TIMESTAMP
来匹配now
)和更新(必须在上一次写入后的100秒内完成)。其中一个问题当然是,您正在初始化:
firebaseRef.child("time").setValue(ServerValue.TIMESTAMP, listener);
这将time
的值设置为long
{
"time": 1460776272703
}
但是:
HashMap<String, Object> map = new HashMap<>();
map.put("time", timestamp);
ref.child("time").setValue(map, listener);
即使这是有意的,像这样改变数据结构似乎是个坏主意。例如,在模拟器中,我很快遇到如下错误消息:
类型错误:+仅对数字和字符串进行操作
因为它试图将JSON对象(/time
在上面的第二个代码段中)作为数值计算
我的工作片段更简单:
Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/36658910");
ref.child("time").setValue(ServerValue.TIMESTAMP, listener);
/*ref.child("time").addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
Long timestamp = (Long) dataSnapshot.getValue();
System.out.println(timestamp);
dataSnapshot.getRef().setValue(timestamp);
}
public void onCancelled(FirebaseError error) { }
});*/
我这样运行它,以便对位置进行测试,然后再运行另一次,禁用初始的setValue()
,并启用侦听器来测试更新
相应的安全规则:
"time": {
".write": true,
".validate": "(!data.exists() && newData.val() == now) || newData.child('time').val() + 100000 >= now"
}
您会注意到,我有单独的案例来写入初始值(必须使用
ServerValue.TIMESTAMP
来匹配now
)和更新(必须在上次写入后100秒内)。firebaseRef指向什么?您的安全规则说时间必须大于now+10000,但是Firebase.ServerValue.TIMESTAMP将设置为现在。@frankvanpoffelen firebaseRef这是我的应用程序引用Firebase firebaseRef=new Firebase(“我的应用程序url”)
@Kato抱歉,我不明白你的意思。我想现在指的是服务器时间,时间的值指的是我的程序开始时间。我比较看插入操作是否在开始时间后的10秒内。我的逻辑错了吗?firebaseRef
指向什么?你的安全规则说时间必须大于现在+10000,但是Firebase.ServerValue.TIMESTAMP将设置为现在。@FrankvanPuffelen firebaseRef这是我的应用程序的引用Firebase firebaseRef=new Firebase(“我的应用程序url”)
@Kato抱歉,我不明白你的意思。我想现在指的是服务器时间,时间的值指的是我的程序开始时间。我比较看插入操作是否在开始时间后的10秒内。我的逻辑错了吗?谢谢你的回答。我不知道问题出在哪里,但是firebaseRef.child(“time”).setValue(ServerValue.TIMESTAMP,listener)
没有设置任何值,我已经尝试了很多次,这就是为什么我必须自己节省时间的原因。我想now
指的是服务器上的当前时间,时间值指的是我的程序开始时间。当我插入一个项目时,我将时间值与now
进行比较,以确保差异在指定的毫秒内,但这也不起作用。可能是我的错,我误解了时间戳,现在出现了。您的初始设置值()
由于多种原因失败。这里有一个time/time
嵌套,不允许设置初始值。我的安全规则和代码在上面工作。试试看,看看我和你的有什么不同。谢谢你的回答。我不知道问题出在哪里,但是firebaseRef.child(“time”).setValue(ServerValue.TIMESTAMP,listener)
没有设置任何值,我已经尝试了很多次,这就是为什么我必须自己节省时间的原因。我想now
指的是服务器上的当前时间,时间值指的是我的程序开始时间。当我插入一个项目时,我将时间值与now
进行比较,以确保差异在指定的毫秒内,但这也不起作用。可能是我的错,我误解了时间戳,现在出现了。您的初始设置值()
由于多种原因失败。这里有一个time/time
嵌套,不允许设置初始值。我的安全规则和代码在上面工作。试试看,看看我和你的有什么不同。