我想将所有联系人保存并检索到Firebase Firestore,需要结构来保存和检索联系人

时间:2019-06-23 10:47:29

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

我正在开发一个应用程序,它具有获取用户所有联系人并将其上传到服务器的功能。在这里,我使用Firebase Firestore作为后端。我可以得到所有没有重复的联系人。在需要保存用户的联系信息时,我需要哪种文档结构可以提供帮助吗?请告诉我适当的格式,以免在Firestore中占用太多空间。

然后..

保存所有联系人后,我必须能够使用用户输入的号码来获取联系人的姓名。这是我的要求。简而言之,我想知道如何为Firestore保存2500个联系人详细信息,以及如何在联系人编号的帮助下读取单个联系人姓名,以及用户在edittext中键入的内容。 (注意:听说我们无法一次保存2500个用户的联系方式,应该使用批处理之类的方式)

enter image description here

我尝试了以下代码,但仅保存了前800个联系人。

`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();
    }` 
  1. 请告诉我如何将数据保存在Firestore(结构)中
  2. 请告诉我在号码的帮助下读取单个联系人的姓名

1 个答案:

答案 0 :(得分:2)

  
      
  1. 请告诉我如何将数据保存在Firestore(结构)中
  2.   

如果您使用身份验证,则应用程序用例的可能数据库架构可能是:

Firestore-root
   |
   --- users (collection)
        |
        --- uid (document)
             |
             --- // user properties
             |
             --- contacts (subcollection)
                   |
                   --- contactId (document)
                         |
                         --- phoneNumber: 123456789
                         |
                         --- // other contact properties

要获得用户拥有的所有联系人,只需在联系人引用上附加一个侦听器即可:

db.collection("users").document(uid).collection("contacts");
  
      
  1. 请告诉我在号码的帮助下读取单个联系人的姓名
  2.   

要获取具有电话号码的单个联系人的详细信息,请使用以下查询:

db.collection("users").document(uid).collection("contacts").whereEqualTo("phoneNumber", 123456789);

根据有关maximum number of documents that can be added in single batch的官方文档:

  

每笔交易或批量写入最多可写入500个文档。

因此,您必须将联系人分成500个文档,才能将所有这些联系人添加到Firestore。

编辑:

  

如果我假设一个用户的手机中有4000个联系人(仅手机号和姓名* 4000 = 8000个来自单个用户的数据)。

那是不正确的,如果您只有2个属性(在联系人文档中),则您将只有4000个写操作,而不是 8000个,因为这两个属性都属于同一文档。因此,您必须使用批写或POJO类将它们一起编写。

  

如果用户数量达到500万,那么将需要在Firestore中存储大量数据。

是正确的,但同时这意味着您将拥有一个非常成功的应用程序,并且您可以负担所有这些写操作。 500万人相信我,很多。

  

所以我想要一个架构最好的架构,应该尽可能少地容纳空间

问题不在于空间,而是与您执行的读写次数有关。 Firestore中的Evrything与读写次数有关。

  

我期望一种非常有效的数据保存方式。请帮助

根据我的看法,以上架构可以帮助您解决问题。

  

考虑到这一点,您的答案仍然是最佳解决方案?

考虑您的问题和评论,是的。

  

是否可以忽略uid,联系人id并且仅具有这些参数

仅当您使用Firebase realtime database(这是另一种产品)时。没有集合和文档,只有JSON数据库结构。