【问题标题】:I cant get the values from Firebase and put them in to TextView in fragment我无法从 Firebase 获取值并将它们放入片段中的 TextView
【发布时间】:2018-04-27 14:10:56
【问题描述】:

在我的应用中,我创建了登录和注册页面,并将用户名和电子邮件保存到我的 Firebase 数据库中。我还用片段做了底部导航。我想从 Firebase 中获取这些值(姓名、邮件)并将其放入配置文件片段中的 TextView 中。当我尝试这个时,我的应用程序崩溃了。我该如何解决这个问题?

public class ProfileFragment extends Fragment {
    private FirebaseDatabase mFirebaseDatabase;
    private FirebaseAuth mAuth;
    private String userID;

    private TextView tName;
    private TextView tEmail;


    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View profileView = inflater.inflate(R.layout.fragment_profile, null);

        tName=profileView.findViewById(R.id.tv_name);
        tEmail=profileView.findViewById(R.id.tv_email);


        mAuth=FirebaseAuth.getInstance();
        mFirebaseDatabase=FirebaseDatabase.getInstance();
        final DatabaseReference myRef=mFirebaseDatabase.getReference("users");
        FirebaseUser user=mAuth.getCurrentUser();
        userID=user.getUid();

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds: dataSnapshot.getChildren()){
                    User user=new User();
                    user.setUserName(ds.child(userID).getValue(User.class).getUserName());
                    user.setUserEmail(ds.child(userID).getValue(User.class).getUserEmail());

                    tName.setText(user.getUserName());
                    tEmail.setText(user.getUserEmail());
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });

        return profileView;
    }
}

【问题讨论】:

  • 我们需要看看你的数据库结构:)
  • 也发布你的错误!
  • 我没有足够的代表来上传图片。我可以很容易地解释,在我的 firebase 数据库中,我有用户参考,在用户参考中,我有几个子名称用户 ID,并且子值名称电子邮件
  • 致命异常:主进程:com.example.burak.anonstezapp,PID:22212 java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String com.example.burak.anonstezapp。空对象引用上的 User.getUserName()'

标签: java android firebase android-fragments firebase-realtime-database


【解决方案1】:

假设您的数据库结构类似于:

Firebase-root
   |
   --- users
         |
         --- uid
              |
              --- name: "John"
              |
              --- email: "john@email.com"

要打印姓名和电子邮件,请使用模型类使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user = dataSnapshot.getValue(User.class);
        String name = user.getUserName();
        tName.setText(name);
        String email = user.getUserEmail();
        tEmail.setText(email);
        Log.d("TAG", name + " / " + email);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

如果您想使用 String 类更简单地打印它们,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String name = dataSnapshot.child("name").getValue(String.class);
        tName.setText(name);
        String email = dataSnapshot.child("email").getValue(String.class);
        tEmail.setText(email);
        Log.d("TAG", name + " / " + email);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

在这两种情况下,输出都是:John / john@email.com

【讨论】:

  • 非常感谢你的帮助,你救了我:)
【解决方案2】:

在 xml 文件夹中创建文件

<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
    <entry>
       <key>email</key>
       <value>name</value>
</entry>

public FirebaseRemoteConfig getmFirebaseRemoteConfig() {

    mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();

    FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()
             //.setDeveloperModeEnabled(BuildConfig.DEBUG)
            .setDeveloperModeEnabled(false)
            .build();
    mFirebaseRemoteConfig.setConfigSettings(configSettings);

    mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);


    return mFirebaseRemoteConfig;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 2022-01-08
    • 2018-01-24
    • 2011-11-13
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    相关资源
    最近更新 更多