【问题标题】:Firebase [Android] Get list from database to map?Firebase [Android] 从数据库获取列表到地图?
【发布时间】:2017-04-24 02:30:13
【问题描述】:

我的 Firebase 数据库中的用户可以有朋友,即其他用户。以下是它的结构:

users
|
|---123
|    |
|    |---username: "Adam Sandler"
|    |
|    |---friendlist
|        |
|        |---456: true
|        |
|        |---789: true
|---456
|    |
|    |---username: "Chris Rock"
|
|---789
:     |
:     |---username: "Kevin James"

我想将friendlist 部分加载到map 中,然后将其加载到recyclerview 中。这是来自我的片段:

FirebaseDatabaseReference = FirebaseDatabase
                .getInstance()
                .getReference(
                        FirebaseAuth.getInstance().getCurrentUser().getUid() //Lets say this equals "123"
                );
        mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendList, FriendViewHolder>(
                FriendList.class,
                R.layout.friend_view,
                FriendViewHolder.class,
                mFirebaseDatabaseReference.child("friendlist")
        ) {
            @Override
            protected void populateViewHolder(FriendViewHolder viewHolder, FriendList model, int position) {
                viewHolder.getTextView.setText(getRef(position).getKey().toString());
            }
        };

这是其他类:

public final class FriendViewHolder extends RecyclerView.ViewHolder{

    private TextView textView;

    public FriendViewHolder(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.friendTextView);
    }

    public TextView getTextView() {
        return textView;
    }

}

和:

public class FriendList {

    private Map<String, Boolean> map;

    public FriendList(){}

    private Map<String, Boolean> getMap(){
        return map;
    }

}

当我运行应用程序时,recyclerview 是空的。有什么建议我可能需要在这里做什么?

编辑:

我收到此警告:

W/FirebaseRecyclerAdapter: com.google.firebase.database.DatabaseException: Firebase Database error: Permission denied
                                                                                           at com.google.firebase.database.DatabaseError.toException(Unknown Source)
                                                                                           at com.firebase.ui.database.FirebaseRecyclerAdapter.onCancelled(FirebaseRecyclerAdapter.java:224)
                                                                                           at com.fishindustries.bellyflop.adapter.UserFirebaseRecyclerAdapter.onCancelled(UserFirebaseRecyclerAdapter.java:44)
                                                                                           at com.firebase.ui.database.FirebaseRecyclerAdapter$1.onCancelled(FirebaseRecyclerAdapter.java:108)
                                                                                           at com.firebase.ui.database.FirebaseArray.notifyCancelledListeners(FirebaseArray.java:124)
                                                                                           at com.firebase.ui.database.FirebaseArray.onCancelled(FirebaseArray.java:105)
                                                                                           at com.google.android.gms.internal.zzbox.zza(Unknown Source)
                                                                                           at com.google.android.gms.internal.zzbqv.zzZT(Unknown Source)
                                                                                           at com.google.android.gms.internal.zzbra$1.run(Unknown Source)
                                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                                           at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

在我的 Firebase 数据库规则中,我在 /users 下设置了规则,以允许读取 auth != null 并写入 if $uid == auth.uid

【问题讨论】:

  • @FrankvanPuffelen 你能在这里输入一下吗?

标签: android firebase firebase-realtime-database


【解决方案1】:

对于加载数据,您必须创建

class User(){
  String username;
  Map <String, Boolean> friendlist;
  ....
}

然后从用户获取列表并创建列表。 但是使用 FirebaseRecyclerAdapter,您可以提供用户列表!

如果你想为一个用户创建好友列表,你需要 获取 UserId 查询并获取适配器列表。

所以,首先不要创建 User 类或 FriendList 类。 只需添加这个,必须工作:

     DatabaseReference userRef = FirebaseDatabase.getInstance().getReference(                                   
               FirebaseAuth.getInstance().getCurrentUser().getUid());
                 userRef.addListenerForSingleValueEvent(new ValueEventListener() {
                  @Override
                  public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, Object> userData = (Map<String,Object>)dataSnapshot.getValue(); 
Map <String, Boolean> resultMap = (Map<String,Boolean>)userData.get("friendlist");
adapter.add( new ArrayList<>(resultMap.keySet()));
            }
                                        @Override
                                        public void onCancelled(DatabaseError databaseError){
                                            // Logic for failure is here...   
                                        }
                                    });

【讨论】:

  • 你的意思是 Map 吗?我这样做了,但它仍然不起作用
  • 谢谢,我会调查一下,我会尽快回复您!
  • @Carlton,可能必须转换新的 ArrayList(uniqueRecs.keySet());
【解决方案2】:

Permission denied 通常意味着它来自rules 问题。首先尝试通过数据库模拟器读取数据,以确保您的rules 设置正确。

然后,作为 Sergey 的回答。我会尝试addListenerForSingleValueEvent 来检索值。如果您需要处理实时数据FirebaseRecyclerAdapter 很有用。但如果你不这样做,最好制作自己的自定义回收器适配器。就我而言,我将自定义回收器适配器用于非实时和实时数据库,因为 FirebaseRecyclerAdapter 有一些限制。

【讨论】:

  • 感谢@wonsuc 的帮助!我不知道为什么会出现规则问题,但它现在停止了。
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2018-01-19
  • 2019-10-01
相关资源
最近更新 更多