3

私はかなりの時間ソリューションを検索しようとしていましたが、無駄です。私は明らかにFirebaseの専門家ではなく、コード作成方法を学んでいます。Firebase Realtime Databaseのlong値は、0以外の場合でも常に0を返します。

私は現在、Firebaseが提供する電子メール検証システムの上に、手動で自分で行う必要がある認証の別の層があるログインシステムを作成しています。したがって、これを達成するために、私は自分のプロジェクトにFirebase Realtime Databaseを導入しました。次に、データベース内のJSONファイルのスニペットを示します。

{ 
"users" : { 
    "abfkbnqeiurbnafjbnaojn" : { 
    "app_authorized" : 1, 
    "email" : "[email protected]", 
    "full_name" : "Test Sample", 
    "user_id" : "abfkbnqeiurbnafjbnaojn" 
    } 
} 
} 

あなたはJSONファイルから見ることができるように、app_authorizedキーと値のペアは、ユーザーがサインインできるかどうかを支配するが(0が1ユーザーが署名する資格があることを意味している間、ユーザーは対象外であることを意味し-に)。私はFirebaseのサインインからユーザーのUIDを使用して、すべてのキーと値のペアについて、親の電子メールとパスワードシステムを使用しています。 app_authorizedの値の型が長いことも知っています。

私のSignInActivityで使用したコードは次のとおりです。

long isAppAuthorized; 

//some codes here 

private void init() { 

     btnSignIn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "onClick: attempting to log in"); 

       String email = emailEditText.getText().toString(); 
       String password = passwordEditText.getText().toString(); 

       //validates respective EditTexts 
       if (TextUtils.isEmpty(email)) { 

        emailEditText.setError("Please fill in your e-mail address!"); 

       } 
       else if (TextUtils.isEmpty(password)) { 

        passwordEditText.setError("Please fill in your password!"); 

       } else { 

        progressDialog.show(); 

        mAuth.signInWithEmailAndPassword(email, password) 
          .addOnCompleteListener(SignInActivity.this, new OnCompleteListener<AuthResult>() { 
           @Override 
           public void onComplete(@NonNull Task<AuthResult> task) { 
            Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful()); 

            FirebaseUser user = mAuth.getCurrentUser(); 
            firebaseDatabase = FirebaseDatabase.getInstance(); 

            userID = user.getUid(); 

            final DatabaseReference myRef = firebaseDatabase.getReference("users/" + userID + "/app_authorized"); 

            myRef.addValueEventListener(new ValueEventListener() { 
             @Override 
             public void onDataChange(DataSnapshot dataSnapshot) { 
              //gets value of isAppAuthorized 
              isAppAuthorized = dataSnapshot.getValue(long.class); 
             } 

             @Override 
             public void onCancelled(DatabaseError databaseError) { 

             } 
            }); 

            // If sign in fails, display a message to the user. If sign in succeeds 
            // the auth state listener will be notified and logic to handle the 
            // signed in user can be handled in the listener. 
            if (!task.isSuccessful()) { 

             Log.w(TAG, "signInWithEmail:failed", task.getException()); 
             Toast.makeText(SignInActivity.this, R.string.auth_failed, 
               Toast.LENGTH_SHORT).show(); 
             progressDialog.dismiss(); 

            } else { 

             try { 
              //this is the part where I check for both isEmailVerified and isAppAuthorized 
              if(user.isEmailVerified() && isAppAuthorized == 1) { 

               Log.d(TAG, "onComplete: success. e-mail is verified " + user.isEmailVerified() + " userIsAuthorized: " + isAppAuthorized); 
               Intent intent = new Intent(SignInActivity.this, HomeActivity.class); 
               startActivity(intent); 

              } else { 

               Log.d(TAG, "onComplete: failed: isEmailVerified: " + user.isEmailVerified() + " userIsAuthorized: " + isAppAuthorized); 

               progressDialog.dismiss(); 
               mAuth.signOut(); 
               Intent intent = new Intent(SignInActivity.this, MainActivity.class); 
               startActivity(intent); 

              } 

             } catch(NullPointerException e) { 

              Log.e(TAG, "onComplete: NullPointerException: " + e.getMessage()); 

             } 
            } 

            // ... 
           } 
          }); 
       } 
      } 
     }); 

    } 

私が遭遇した問題は、長いisAppAuthorizedは関係なく、常に私は無用の承認の私の第二の層をレンダリング、このように、データベースに入れてどのような値の0を返すということです。

私は多くのことを試しても問題の原因を理解することができないので、誰かが私を助けてくれることを願っています。

+0

'isAppAuthorized = dataSnapshot.getValue(Long.class)を試してみてください;' – Tarun

+0

これは私が資本Lでロングに変数宣言とlong.classの両方を変更した後、(それが戻って働いていましたしかし、NullExceptionエラー)。長いのではなくロングを使わなければならない理由はありますか? – applejuice

+1

longはオブジェクトへの参照で、longはプリミティブです。 – Tarun

答えて

1

用途:

isAppAuthorized = dataSnapshot.getValue(Integer.class); 
+0

Tarunのコメントを参照して、私もこれを試しました。それはまた働いた(しかし、最初にNullExceptionエラーを出した)。これはintとlongがIntegerとLongに比べてnull参照を返すことができないためですか? ありがとう、私はNullExceptionエラーを解決しようとします。 – applejuice

+1

@applejuice dataSnapshot.getValue(Long.class);あなたはクラスを渡す必要がありますが(長さはクラスです)、長いクラスではありません –

+1

@applejuice app_authorizedが存在しない場合はnullを取得できますfirebaseコンソールからデータベースを確認してください –

関連する問題