2016-03-22 3 views
-1

Firebaseデータベースから特定の値を取得しようとしていますが、これまでに行っていましたが、少し違うことをしようとしています。 void型のメソッドから "を返します。voidの結果型を持つメソッドから値を返すことができません

私は新しいJavaプログラマーなので、いくつかのプログラミングルールが欠けていると思います。

これは私のコードです:

public int getVotesForEvent(final String event_title) { 
    firebaseRef.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.child("Votes").exists()) { 

       for (DataSnapshot event : dataSnapshot.child("Votes").getChildren()) { 
        String event_title2 = event.getKey(); 
        if (event_title2.equals(event_title)) { 
         int count=Integer.parseInt(event.getValue().toString()); 
         return count; 

        } 


       } 

      } 
      else { 
       int count = 0 ; 
       return count; 
      } 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
} 

私は数を返すようにしようとしているところ、エラーが表示されます。コメントを読んだ後

が、これは私のコードであり、現在の方法は、宣言された変数のカウントには影響しません、それは0を保持します:

int count=0; 
public int getVotesForEvent(final String event_title) { 

    firebaseRef.addValueEventListener(new ValueEventListener() { 

     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      if (dataSnapshot.child("Votes").exists()) { 
       boolean flag=false; 
       for (DataSnapshot event : dataSnapshot.child("Votes").getChildren()) { 
        String event_title2 = event.getKey(); 
        if (event_title2.equals(event_title)) { 
         flag=true; 
         Toast.makeText(EventInfo.this, ""+Integer.parseInt(event.child("event_votes").getValue().toString()), Toast.LENGTH_SHORT).show(); 
         count=Integer.parseInt(event.child("event_votes").getValue().toString()); 


        } 


       } 
       if(flag!=true) 
       { 
        count=0; 
       } 

      } 
      else 
      { 
       count=0; 
      } 

     } 



     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 

    }); 
    return count; 

} 

私は今、間違って何をしているのですか?

+1

戻り値voidを持つ関数の中に何も返すことはできませんが、より大きな問題は、非同期メソッドを同期メソッドに変換しようとしていて、そのように動作しないことです。 – Alex

+0

http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –

+0

を参照して、クラス変数として 'count'を宣言するか、変数をfinalとして宣言します(ここで問題を解決することはできません)または内部クラスを別のクラスに移動します。 最も簡単なのは、変数をクラス変数にすることです。 –

答えて

5

voidのjavaメソッドでは、メソッドは何も返しません。

onDataChange戻り値の型がvoidの場合、値countを返すことはできません。

あなたはそれを

+0

こんにちは、私はあなたが言ったことを試して、私は新しいコードを追加しました、一見してください。ありがとう。 –

+0

@GiladNeigerフィールドは、オブジェクトスコープまたは単にグローバル変数で宣言された変数であり、最終的なことを避けるために使用します。 – Pragnani

+0

どういう意味ですか?あなたは手の込んだことや例を教えていただけますか? –

0

が必要な場合は、お使いのOnDataChangeのメソッドが無効とマークされ、まだあなたはそれから復帰しようとしているreturn文を削除し、フィールドにcount値を保存してください。戻り値の行を削除し、変数に値を保存して後で使用します。

0

他の人が書いたように、あなたはvoidメソッドの型から戻ることはできません。 は、しかし、私は、私はあなたが次の理由により、ここで混乱していると思う、整数として戻り値の型を受け入れるあなたのコードでは、ここで二つの方法、

public int getVotesForEvent(final String event_title) 
public void onDataChange(DataSnapshot dataSnapshot) 

最初のものがあります(つまりint型)。他の人は戻り値のない型を期待しています。

2番目の方法は、 'return count'と書かれているため、失敗します。

関連する問題