【问题标题】:Retrieve Contact Data From Firestore Efficiently Using A Query使用查询有效地从 Firestore 检索联系人数据
【发布时间】:2019-11-19 20:54:38
【问题描述】:

我的要求是,当用户 Mr.ABC 安装应用程序时,它将获取用户的所有联系人并保存到 Firebase Firestore。而当另一个用户 Mr.XYZ 在他的设备上安装该应用程序时,它将获取 XYZ 的所有联系人并保存到 Firebase。同样,无论谁安装该应用程序,它都会获取联系人并保存到 Firebase Firestore。现在我的读取操作应该是,Mr.ABC 将在 EditText 和 firebase 中输入 XYZ 号码,我必须查看 XYZ 联系方式并找出 ABC 的号码并获取 XYZ 在他的联系人中保存的名称。所以当 ABC 输入 XYZ 号码时,ABC 可以找出 XYZ 保存了 ABC 的号码是在哪个名字中的。请帮助我应该以哪种结构将联系人保存在 firebase 中,以及如何读取数据。我想知道执行此操作的有效方法。由于我不擅长数据库,因此帮助我编写准确的代码会更有帮助。请帮忙。

我尝试了下面的代码,但只有 800 个联系人存储到 Firestore 而不是 2500 个,而且我不确定我使用的数据库结构是对还是错。我对数据库的了解为零。

    private void doUploadContactstoCloud() {
        dialog.setCancelable(false);
        dialog.setMessage("Please wait we are configuring your request ...");
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        dialog.show();
        listContacts = new ContactPresenter(this).fetchAllContacts();
        int j = listContacts.size();

        Log.d("sizejhfg",j+"");

        double size = listContacts.size();
        double ind = 0;
        Map<String, Object> contact = new HashMap<>();
        // Get a new write batch
        WriteBatch batch = db.batch();
        for (Contact con : listContacts) {
            for (int i = 0; i < con.numbers.size(); i++) {
                String number = formatnum(con.numbers.get(i).number);
                if (number != null) {
                    if (!number.equals("0") && number.length() < 5) {

                        Map<String, Object> contactnumber = new HashMap<>();
                        contactnumber.put("name", con.name);
                        contactnumber.put("number", number);
                        contact.put(number,contactnumber);
                        DocumentReference item = db.collection(tonumber).document(number);
                        batch.set(item,contactnumber);
                        ind++;
                        if(ind==500){
                            doCommit(batch);
                            batch=db.batch();
                            ind=0;
                        }
                    }
                }
            }
            //dialog.setProgress((int) (ind / size) * 100);
        }
        if(ind>0){
            doCommit(batch);
        }
        prefManager.setisContactUpload(true);
        doDismissDialog();
    }` 

【问题讨论】:

  • 到目前为止你尝试过什么?这太宽泛了。
  • 添加了我试过的代码
  • 在添加数据和提交批处理时尝试使用:addSuccessListener & addFailureListener。你可以用它来调试,找出问题所在。
  • 见Add data to Cloud Firestore。我使用自定义对象调用添加(未设置),这使 firestore 为您自动生成文档 ID。
  • Yosi 和 Ron 没有帮助

标签: android firebase google-cloud-firestore android-contacts


【解决方案1】:

这是您问题的可能答案 -

首先,Firestore 数据库结构。我暂时称它为 db 结构。这是一个可能适合您的模板 -

c- Contacts
   d- +1 9999999999 //ABC's Phone No.
      f- +1 0000000000 : XYZ's Number // XYZ's Saved Name in ABC's Contacts and his phone no.
      f- +1 1111111111 : LMN's Number // LMN's Saved Name in ABC's Contacts and his phone no.
   d- +1 0000000000 //XYZ's Phone No.
      f- +1 9999999999 : ABC's Number //ABC's Saved Name in XYZ's Contacts and his phone no.
      f- +1 1111111111 : LMN's Number // LMN's Saved Name in XYZ's Contacts and his phone no.

其次,这是我认为可用于添加和查询数据库的代码 -

Map<String, Object> contacts = new HashMap<>();
contacts.put("+1 0000000000", "XYZ's Number");
contacts.put("+1 1111111111", "LMN's Number");

db.collection("contacts").document("+1 9999999999")
        .set(contacts)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "DocumentSnapshot successfully written!");
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "Error writing document", e);
            }
        });

编辑这部分以获得更有效的查询 -

db.collections("contacts").document("+1 9999999999").get(EditTextEnteredNumber)
        .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for (QueryDocumentSnapshot snap : queryDocumentSnapshots) {
                    Log.d(TAG, snap.getId() + " => " + snap.getData());
                    TextViewContactName.setText(snap.getData());
                }
            }
        });

希望这会有所帮助!

来源

【讨论】:

  • 感谢您试一试,但在这里,它不仅仅是两个用户,而且这两个用户不会有 2 个联系人。它将有 100 万用户,每个用户有 5000 个联系人。请更新您的答案。
  • 如果我遵循这个,我需要获取用户的全部联系人。例如,如果用户有 5000 个联系人,仅获取一个联系人详细信息,我需要获取所有 5000 个联系人。你觉得有什么办法可以让我只联系我什么吗?我认为它存在于我们保存数据的方式中,即数据库中的数据结构。
  • 根据文档,Firestore 不会获取查询中的所有数据,它只会获取正在查询的数据。我在这部分的知识有限,很抱歉我帮不上什么忙。不过,我将尝试收集更多关于此的信息,并希望在明天或后天编辑我的答案。
  • 尝试查看 Firestore 文档中的所有链接,从这个开始 - firebase.google.com/docs/firestore/manage-data/structure-data
  • 编辑答案以获得更有效的查询 - 希望对您有所帮助!!
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2018-10-13
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多