2017-07-22 8 views
0

私は長い間検索しましたが、私はonDataChangedをトリガーとするaddListenerForSingleイベントを使用して解決策を見つけることができます。データベースに変更があったときだけ起動しました。ページ内のfirebaseデータを読み込んでいます。

ページが読み込まれたときに単一の値を取得するにはどうすればいいですか(onCreateを意味します)?

たとえば、値を取得する方法が、鍵が本当に簡単です

mReference.child("kotran").child("isactive").getKey() 
//isactive 

を取得していない。しかし。

+0

Firebaseから値を取得するには、リスナーを接続します。 https://firebase.google.com/docs/database/android/read-and-write#listen_for_value_events –

+0

を参照してください。リスナーから値を取得できることはわかっていますが、ページが読み込まれるとonDataChangeなどのメソッドしかありません。 onDatachangeは呼び出されません。私はoncreateが呼び出されたときに値を取得したいと思います。 –

+2

'onDataChange'はすぐに現在の値で起動します。ドキュメントから: "このメソッドは、リスナーが**接続されたときに**一度起動され、子供を含むデータが変更されるたびに再度トリガされます。"リスナーはすぐに発砲します(試してみてください)。この作業に問題がある場合は、[問題を再現する最小限のコード]を共有してください(http://stackoverflow.com/help/mcve)。 –

答えて

0

addListenerForSingleValueEventこのようなリスナーを初めて登録すると、一度呼び出されます。 全体の機能のために、この一般的なKotlinの例を見てみましょう:それはSingle<T>を返して

override fun <T : Any> getValue(typeClass: KClass<T>, reference: String, vararg children: String): Single<T> = 
     Single.create({ 
      val databaseReference = firebaseDatabase.getReference(reference) 

      databaseReference.addListenerForSingleValueEvent(object : ValueEventListener { 
       override fun onCancelled(dbError: DatabaseError?) { 
        it.onError(FirebaseDatabaseException(
          dbError?.message ?: context stringOf R.string.database_error, 
          dbError?.details ?: exceptionDetails(reference, children)) 
        ) 
       } 

       override fun onDataChange(dataSnapshot: DataSnapshot?) { 
        val value = childDataSnapshot(dataSnapshot, children)?.getValue(typeClass.java) 
        if (value != null) { 
         it.onSuccess(value) 
        } else { 
         it.onError(RetreivedValueNullException(exceptionDetails(reference, children))) 
        } 
       } 
      }) 
     }) 

あなたがRxJavaを使用していない場合は、しかし、ちょうど関連Single.createラップを削除して、T

実装を返しますexceptionDetails()

private fun exceptionDetails(reference: String, children: Array<out String>): String = 
     "Exception occurred on reference: $reference and children: ${children.forEach { String.format("-> %s", it) }}" 

および使用方法の一例(この機能は、いくつかのFirebaseRepositoryにある場合:

firebaseRepository.getValue(Boolean::class, "kotran", "isActive") 
    .subscribeOn(Schedulers.io) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe({ /* do something with the value */}, 
       { /* do something with the error */}) 

さらに詳しい情報がありますgist

0

Firebugには、getKey()などの参照で直接動作するgetValue()メソッドはありません。値を取得するには、リスナーを使用する必要があります。 onDataChange()メソッドは、現在の値をただちに返します。 HereはFirebaseの公式ドキュメントです。 listen for value eventsセクションを確認してください。

希望します。

関連する問題