【问题标题】:Firebase Database showing duplicates in App?Firebase 数据库在 App 中显示重复项?
【发布时间】:2020-09-08 00:16:47
【问题描述】:

我正在尝试查看我手机上的所有联系人并已在应用程序上注册。我可以看到注册的联系人,但正如您所见,我在数据库中有一个用户名 John 的条目,而在 Android 应用程序中,它显示了多个。我只想展示一次。不知道是什么原因,有大神帮忙吗? 这是代码

public class UsersFragment extends Fragment {

private RecyclerView recyclerView;
private RecyclerView.Adapter mUserlist;
ArrayList<ProfileInfo> list, userList;
DatabaseReference db;

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

    View view = inflater.inflate(R.layout.fragment_users, container, false);

    db = FirebaseDatabase.getInstance().getReference().child("UserInfo");

    recyclerView = view.findViewById(R.id.UserRecyclerView);
    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setHasFixedSize(false);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    list = new ArrayList<>();
    userList = new ArrayList<>();
    mUserlist = new UsersAdapter(userList);
    recyclerView.setAdapter(mUserlist);
    displayContactList();
    return view;
}


private void displayContactList() {
    Cursor numberList = getActivity().getApplicationContext().getContentResolver().query
            (ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, null, null, null);
    assert numberList != null;
    while (numberList.moveToNext()) {
        String name = numberList.getString(numberList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = numberList.getString(numberList.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

        ProfileInfo info = new ProfileInfo(name, phoneNumber);
        list.add(info);
        showAppUsers(info);
    }
}

private void showAppUsers(ProfileInfo info){
    Query query = db.orderByChild("phoneNumber").equalTo(info.getPhoneNumber());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists() ){
                String phone ="",
                       name="";
                for (DataSnapshot child : dataSnapshot.getChildren()){
                    if (child.child("phoneNumber").getValue() != null)
                        name = Objects.requireNonNull(child.child("userName").getValue()).toString();
                    if (child.child("userName").getValue() != null)
                        phone = Objects.requireNonNull(child.child("phoneNumber").getValue()).toString();

                    ProfileInfo info = new ProfileInfo(name, phone);
                    userList.add(info);
                    mUserlist.notifyDataSetChanged();
                    return;

                }

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
}

【问题讨论】:

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


    【解决方案1】:

    正如我在您的数据库中看到的,您只有一条记录。使用以下查询时:

    Query query = db.orderByChild("phoneNumber").equalTo(info.getPhoneNumber());
    

    确实会返回一条记录。问题不在于您的查询。问题在于您在 while 循环中调用 showAppUsers() 方法。最有可能的是,您的 numberList 包含三个记录,因此是这种行为。因此,在每次迭代中,您都将userName 属性的值添加到userList。要解决这个问题,请在循环外调用showAppUsers() 方法,这样您就只能得到一个结果。

    【讨论】:

    • 我试过了,但是从 while 循环之外调用它后,它没有显示任何用户。
    • 这不是因为info.getPhoneNumber() 什么都不返回。请务必将值传递给 equalTo 方法。尝试使用硬编码值,它有效吗?
    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2021-12-26
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多