如何在Android中使用Firebase存储用户数据?

时间:2017-03-08 21:54:55

标签: android firebase firebase-realtime-database firebase-authentication

我需要为登录到应用程序的每个用户创建和使用包含所有详细信息(uid,名称等)的数据库条目

我无法存储用户数据,以便在Android中使用Firebase来使用和检索用户个人资料信息。我在旧版本的Firebase上找到了此documentation,但这似乎不再适用。

有没有人知道如何重现上述代码,以便它适用于新版本的Firebase?非常感谢提前。

编辑 - 以下代码:

final Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.authWithPassword("jenny@example.com", "correcthorsebatterystaple",
new Firebase.AuthResultHandler() {
@Override
public void onAuthenticated(AuthData authData) {
    // Authentication just completed successfully :)
    Map<String, String> map = new HashMap<String, String>();
    map.put("provider", authData.getProvider());
    if(authData.getProviderData().containsKey("displayName")) {
        map.put("displayName", authData.getProviderData().get("displayName").toString());
    }
    ref.child("users").child(authData.getUid()).setValue(map);
}
@Override
public void onAuthenticationError(FirebaseError error) {
    // Something went wrong :(
}
});

3 个答案:

答案 0 :(得分:2)

要在firebase数据库(新版本)中创建用户,您需要进行以下更改..

      private FirebaseAuth mAuth;
        String mUserEmail = "jenny@example.com";
        String mPassword = "correcthorsebatterystaple"

      mAuth.createUserWithEmailAndPassword(mUserEmail, mPassword)
     .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {

                    Log.d(LOG_TAG, getString(R.string.log_message_auth_successful) + " createUserWithEmail:onComplete:" + task.isSuccessful());

                    // if task is not successful show error
                    if (!task.isSuccessful()) {

                        try {
                            throw task.getException();
                        } catch (FirebaseAuthUserCollisionException e) {
                            // log error here                            

                      } catch (FirebaseNetworkException e) {
                            // log error here  
                        } catch (Exception e) {
                         // log error here        
                         }

                        } else {

                  // successfully user account created
                 // now the AuthStateListener runs the onAuthStateChanged callback

                    }
                }

            });
         }

现在在onCreate()中添加以下方法。

   final DatabaseReference ref = FirebaseDatabase.getInstance().
     getReferenceFromUrl(https://<YOUR-FIREBASE-APP>.firebaseio.com");
     mAuth = FirebaseAuth.getInstance();
     mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) {
                // User is signed in
             Map<String, String> map = new HashMap<String, String>();
             map.put("provider", user.getProvider());
             if(user.getProviderData().containsKey("displayName")) {
             map.put("displayName",  
             user.getProviderData().get("displayName").toString());
            } 
            ref.child("users").child(user.getUid()).setValue(map);
            } else {
                // User is signed out
                Log.d(LOG_TAG, "onAuthStateChanged:signed_out");
            }
        }
    };

   @Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }

}

答案 1 :(得分:1)

  • 使用电子邮件和密码(Google,Facebook)对用户进行身份验证,请使用Firebase Auth
  • 使用Firebase数据库存储与使用Firebase Realtime Database不同的数据
  • 如果您想从后端管理Auth用户
  

用户管理 - 回复用户的完整数据并更改用户的密码或电子邮件地址   自定义身份验证 - 您可以将外部用户系统与Firebase集成。   身份验证 - 使用该服务在您自己的服务器上识别这些用户。

Firebase Auth有NODE JS sdk您可以使用。如果您想从 Android 访问此功能,则必须创建 Web服务(例如,恢复API)并通过网络与其进行通信。

  • 如果您想在实时数据库中访问已注册的Auth用户,我认为您不能,因为它们彼此分开。您可以在实时数据库中注册用户,但我不会理解为什么要这样做,因为Auth会以更简单的方式为您提供此功能。
  • Firebase实时数据库还有Admin SDK (Java and Node JS)

    请在询问之前查看文档。

答案 2 :(得分:0)

请使用最新版本的Firebase SDK:firebase.google.com/docs。使用旧版SDK(正如您现在所做的那样)将导致比所需更难的时间。

您可以按如下方式获取用户信息:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// I'm actually not sure if this is how you do this part:
exports.getUserByEmail = (email) => {
  return admin.auth().getUserByEmail(email);
}