2017-09-25 206 views
0

情況:我想從我的功能參數與網址從我的火力實時數據庫中檢索比較一網址。檢索工作,但是,我不知道如何從我的if-else語句中的字符串比較中獲取布爾值,其中我得到一個錯誤:「無法將值賦給最終變量'bool'」。如何從onDataChange方法獲取數據?

比較()代碼

private boolean compare(String url) { 
    mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch"); 
    final String newUrl = url; 
    final boolean bool = false; 

    mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.getChildrenCount() > 0) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class); 
        if (executiveOrder.getUrl().equals(newUrl)) { 
         bool = true; 
        } else { 
         bool = false; 
        } 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.e("Executive Order", "The read failed: " + databaseError.getDetails()); 
     } 
    }); 

    return bool; 
} 

回答

0

您不能爲最終變量分配一個新值。

如果您要訪問內部類中的外部類變量,則必須聲明爲final。

一個簡單但不優雅的方式是聲明尺寸1.

mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch"); 
final String newUrl = url; 
final boolean[] bool = new boolean[1]; //boolean array of size 1 

mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     if (dataSnapshot.getChildrenCount() > 0) { 
      for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class); 
       if (executiveOrder.getUrl().equals(newUrl)) { 
        bool[0] = true; //access the bool value like this 
       } else { 
        bool[0] = false; 
       } 
      } 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     Log.e("Executive Order", "The read failed: " + databaseError.getDetails()); 
    } 
}); 

的布爾數組通過你是一個很大的錯誤的方式。你的代碼會一直返回false。

Firebase數據庫方法是異步的,意思是它們在一個單獨的線程中執行,所以我們不能在從數據庫中檢索數據時做出決定。這取決於你的互聯網的速度。

因此您必須調用onDataChange方法內的適當方法。示例...

private boolean compare(String url) { 
    mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch"); 
    final String newUrl = url; 

    mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.getChildrenCount() > 0) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class); 
        boolean bool = executiveOrder.getUrl().equals(newUrl); 
        doSomething(bool); //This method will handle the logic 
       } 
      } 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.e("Executive Order", "The read failed: " + databaseError.getDetails()); 
     } 
    }); 
} 
0

錯誤告訴你是什麼問題。您正試圖將值分配給最終變量。嘗試直接返回true或false。但請注意,Firebase調用是異步的,這意味着它可能會返回方法底部的默認值。

private boolean compare(String url) { 
    mDatabaseReference = mFirebaseDatabase.getReference("Executive Branch"); 
    final String newUrl = url; 
    final boolean bool; 

    mDatabaseReference.limitToFirst(1).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.getChildrenCount() > 0) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        ExecutiveOrder executiveOrder = snapshot.getValue(ExecutiveOrder.class); 
        if (executiveOrder.getUrl().equals(newUrl)) { 
         bool = true; 
        } else { 
         bool = false; 
        } 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.e("Executive Order", "The read failed: " + databaseError.getDetails()); 
     } 
    }); 

    if(bool!=null)  < Add a condition to check if bool is null or not 
    return bool; 
    else return false; 
} 
+0

不能從void結果類型的方法返回true或false雖然 –

+0

您是否知道任何其他可能的方式返回true或false? –

+0

我改變了我的答案,現在應該沒問題。但是我建議你提前做firebase檢索,這樣你就不需要阻止或等待結果。 –

0

使變量bool一個全局變量在你的類並刪除final關鍵字,這樣就可以同時讀取和方法內的任意位置寫入值。

相關問題