【问题标题】:How to retrieve data from one single userID Firebase Android如何从一个用户 ID Firebase Android 检索数据
【发布时间】:2017-06-10 15:44:30
【问题描述】:

在我的 firebase 数据库中,我有一个用户列表,这些用户的信息不同。我想从单个 userId 中检索信息,我将在代码中定义它,并且我只想从该用户那里获取信息。

我的数据看起来像;

UserTable
{
  "fmXWU324VHdDb8v6h7gvNjRojnu33" : {
    "-KbJtw467nl6p253HZ537" : {
      "Name" : "name1",
      "Email" : "something1@something.com",
      "userid" : "fmXWU324VHdDb8v6h7gvNjRojnu33"
    }
  },
  "pJtC45fW0MMi352UiPWnWdIS7h88" : {
    "-Kb012ls9iMnzEL723o9I" : {
      "Name" : "name2",
      "Email" : "something2@something.com",
      "userid" : "pJtC45fW0MMi352UiPWnWdIS7h88"
    },
    "-Kb0aq0q25FJq38256SrC" : {
      "Name" : "name3",
      "Email" : "something3@something.com",
      "userid" : "pJtC45fW0MMi352UiPWnWdIS7h88"
    },
    "-Kb0atopfK64F6jy124Qi1u" : {
      "Name" : "name3",
      "Email" : "something1@something.com",
      "userid" : "pJtC45fW0MMi352UiPWnWdIS7h88"
  }
} 

例如,我想读取并显示来自该用户"fmXWU324VHdDb8v6h7gvNjRojnu33" 的所有数据。我不确定我该怎么做。我试过了,这似乎合乎逻辑,但似乎不起作用:

df.child("UserTable").child(user.getUid())).addChildEventListener(new ChildEventListener()

它给出了这个错误:

Can't convert object of type java.lang.String to type com.android.example.UserTable

另外,我也试过:

df.child("UsersTable").child("userid").child(user.getUid()).ad‌​dChildEventListener(‌​new ChildEventListener() 

我似乎可以弄清楚我做错了什么,因为我所尝试的似乎合乎逻辑并且应该有效。请有人帮帮我。

已编辑:

public ArrayList<data> get(String userID){

      df.child("UsersTable").child(userID).ad‌​dChildEventListener(‌​new ChildEventListener()  {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        fetch(dataSnapshot);
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        fetch(dataSnapshot);
    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

return data;

更新

private void fetchData(DataSnapshot dataSnapshot)
{

    for (DataSnapshot ds : dataSnapshot.getChildren())
    {
        Userdetail userdetail =ds.getValue(Userdetail.class);
        userdetails.add(userdetail );
    }
}

【问题讨论】:

  • 您能否在子事件监听器中添加代码。错误似乎从那里传播
  • 请看更新
  • 为什么在 u_id 中使用 key?
  • 它的推送 ID 将来自同一用户的条目存储为唯一的。因为 1 个用户可以在他们的 id 下添加多个数据,我希望每个数据都是唯一的,而不是覆盖以前的
  • 哦,我添加解决方案检查它

标签: android android-studio firebase firebase-realtime-database userid


【解决方案1】:

首先像这样初始化你的数据库

mDatabase= FirebaseDatabase.getInstance().getReference().child("your_node_name");

然后尝试将ValueEventListener 设置为您的数据库引用。 在onDataChange 方法中,您可以像这样检索数据

public void onDataChange(DataSnapshot dataSnapshot) {
    User user= dataSnapshot.getValue(User.class);
}

编辑:

ValueEventListener postListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        User user= dataSnapshot.getValue(User.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
};
mDatabase.addValueEventListener(postListener);

【讨论】:

  • 您好,抱歉,我不确定这将如何工作,因为您尚未添加任何侦听器。
  • 目前我的代码是,我能够检索数据,但数据是从我只想从定义的用户 ID 获取的所有用户那里检索的
  • 感谢您的更新,我能否检查一下如何仅从一个用户(对于我为其提供用户 ID 的用户)检索数据
  • 我遇到了与 ChildEventListener 相同的情况,您可以在数据库引用中使用 ValueEventListener 并将引用更改为 mDatabase= FirebaseDatabase.getInstance().getReference().child("your_node_name").child("userID");
  • 你知道我如何在给定 uId 和 pushID 的情况下从 firebase 中删除特定条目吗?
【解决方案2】:
  DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("UsersTable").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists())
        {
            for(DataSnapshot userDetails : dataSnapshot.getChildren()) {
                Log.d("valueName:", userDetails.child("Name").getValue());
                Log.d("valueEmail:", userDetails.child("Email").getValue());
                Log.d("valueuserid:", userDetails.child("userid").getValue());
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

使用它会解决你的问题。

【讨论】:

  • 嗨,我收到此错误:无法将 java.lang.String 类型的对象转换为 com.android.example.UserTable 类型
  • 你正在使用 fetch(dataSnapshot);方法?
  • 是的。我在该方法中有一个 for 循环,正是这样做的 for(DataSnapshot userDetails : dataSnapshot.getChildren()
  • 从您的 fetch(dataSnapshot) 中删除循环;并运行。
  • 请查看更新。如果我删除循环如何检索数据
【解决方案3】:

添加值事件侦听器而不是子事件侦听器。

df.child("UsersTable").child(user.getUid()).addValueEventListener(newValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
           if(dataSnapshot!=null){
             fetch(dataSnapshot);
           }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

【讨论】:

  • 你知道我如何在给定 uId 和 pushID 的情况下从 firebase 中删除特定条目吗?
  • 试试这个firebaseRef.child(uid).removeValue()
  • 删除ref.child(userid).setValue(null);
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2016-11-09
  • 2018-03-03
相关资源
最近更新 更多