2017-09-25 18 views
0

状況:私は私のfirebaseリアルタイムデータベースから検索URLと私の関数のパラメータからURLを比較したいです。しかし、検索では、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メソッド内で適切なメソッドを呼び出す必要があります。例...

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キーワードを削除してください。

関連する問題