Java Firebase允许在时间戳内插入

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

自从我的程序启动后,我尝试在时间戳内(大约10秒)插入数据,我有以下数据结构

  • 资料
    • 项目
    • 时间
      • 时间
启动程序时,我将当前时间戳保存在
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
嵌套,不允许设置初始值。我的安全规则和代码在上面工作。试试看,看看我和你的有什么不同。