我尝试这样做但如何执行多次却无法更新Firebase中的对象?

时间:2018-06-29 08:10:32

标签: android firebase firebase-realtime-database

我已经检索了对象表单数据库,然后通过方法SELECT SUM(AHT) as TwoYears FROM ( SELECT CASE WHEN DATEDIFF(year, [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[HireDate], GETDATE()) >= 2 AND (DATEDIFF(year, [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[HireDate], GETDATE())) <= 2 OR (DATEDIFF(year, [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[HireDate], GETDATE())) <= 1 THEN [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[Value] END AS AHT FROM [AgentProfile_CRT].[dbo].[uvw_AHTMaster] WHERE [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[Month] = 'January' AND [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[Year] = 2018 AND [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[AccountID] = 8 AND [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[LOBID] = 23 ) f WHERE AHT = AHT union all SELECT COUNT(*) AS TwoYears FROM ( SELECT CASE WHEN DATEDIFF(year, [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[HireDate], GETDATE()) >= 2 AND (DATEDIFF(year, [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[HireDate], GETDATE())) <= 2 OR (DATEDIFF(year, [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[HireDate], GETDATE())) <= 1 THEN 'Good' END AS Result FROM [AgentProfile_CRT].[dbo].[uvw_AHTMaster] WHERE [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[Month] = 'January' AND [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[Year] = 2018 AND [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[AccountID] = 8 AND [AgentProfile_CRT].[dbo].[uvw_AHTMaster].[LOBID] = 23 ) f WHERE Result = 'Good' 更新了它,然后再次保存了

addreport()

2 个答案:

答案 0 :(得分:0)

使用addListenerForSingleValueEvent()代替addValueEventListener()。您已在ref上实现了连续侦听器。这是正在发生的事情...

步骤1:将侦听器添加到ref并获取数据。该侦听器一直在侦听此引用的更改。

第2步:将数据转换为对象并执行操作(您的逻辑)

第3步:将数据保存到Firebase。现在,您已经更改了数据,您的onDataChanged将再次被调用。

步骤4:但是这次您的对象已经更新,因此添加q.addreport(s);不会改变对象。

第5步:您尝试将数据保存在Firebase中,但是没有要保存的更改,因此它将终止。

希望有帮助!

答案 1 :(得分:0)

FirebaseDatabase.getInstance().getReference("Users")
  .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
  .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Empinfo q = dataSnapshot.getValue(Empinfo.class);
        q.addreport(s);
        dataSnapshot.getRef().setValue(q);
        progressBar.setVisibility(View.GONE);
        Toast.makeText(getApplicationContext(), profileImageUrl, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});

我使用addListenerForSingleValueEvent来获取数据,但不进行实时更新,而使用addValueEventListener来进行每次数据更改的实时更新。 您的问题可能是由于在dataSnapshot.getRef().setValue(q);调用的onDataChange方法内使用了指令addValueEventListener导致的,因此该部分存在递归。