2017-06-01 140 views
0
ATNRef= FirebaseDatabase.getInstance().getReference("AvailableTokenNumber"); 
       ATNRef.runTransaction(new Transaction.Handler() { 
        @Override 
        public Transaction.Result doTransaction(MutableData mutableData) { 

         if (mutableData.getValue(int.class) == 0){ 
          mutableData.setValue(2); 
          data.tokenNo = 1; 
          return Transaction.success(mutableData); 

         }else { 
          data.tokenNo=mutableData.getValue(int.class); 
          mutableData.setValue(data.tokenNo + 1); 
          return Transaction.success(mutableData); 
         } 
        } 

每当代码首次运行时,data.tokenNo的值为0. 之后,根据数据库值正确更新。Android Firebase数据库交易

我无法弄清楚在应用程序/代码的每次首次运行时,data.token = 0的值是什么。

回答

1

您应该期待您的事务中可用的数据的初始快照在第一次执行期间可能为空。请注意,这从the documentation

注:由于doTransaction()被调用多次,它必须 能够处理空数据。即使您的 远程数据库中存在现有数据,但在运行事务 函数时可能不会在本地进行缓存,导致初始值为空。

另外在javadoc它说:

这种方法将被调用,可能多次,在这个位置目前 数据。

期望您的处理程序第一次运行时,它将处理一个空的数据库。然后,当数据已知(如果有的话)时,您应该准备好处理这种情况。如果您不想在该位置没有数据(或未知数据)的地方执行任何操作,只需返回一个成功的事务,而不更改mutableData。

+0

这工作。但数据并未实时反映出来。从数据库中检索数据时,最初显示为0.在与UI元素进行某些交互(如按下按钮或继续)后,'0'变为数据库中的实际值。这不仅发生在第一次访问数据库时,而且每次都要检索数据时,如何避免这种情况?实际数据本身如何在第一时间显示? –

+0

我不确定你的意思。当一个事务完成时,数据将被写入,所有客户端应该能够看到它。 –

+0

希望这可以帮助你理解问题。考虑这种情况:(A)数据库中的值:3(B)事务操作(C)中的值显示为:0(错误的数据)(D)我按下了某个按钮或者在应用程序中刷新了页面(F)值更改为:3(正确的数据) –