Эффективно получить контактные данные из Firestore, используя запрос - PullRequest
2 голосов
/ 10 июля 2019

Мое требование: когда пользователь Mr.ABC установит приложение, оно возьмет все контакты пользователя и сохранит их в Firebase Firestore.И когда другой пользователь Mr.XYZ устанавливает приложение на свое устройство, оно берет все контакты XYZ и сохраняет их в Firebase.Точно так же, кто бы ни устанавливал приложение, он брал контакты и сохранял их в Firebase Firestore.Теперь моя операция чтения должна состоять в том, что Mr.ABC наберет номер XYZ в EditText и в firebase, мне нужно просмотреть контактную информацию XYZ, узнать номер ABC и получить имя, под которым XYZ сохранил свой контакт.Поэтому, когда ABC набирает номер XYZ, ABC может выяснить, под каким именем XYZ сохранен номер ABC.Пожалуйста, помогите мне, в какой структуре я должен сохранить контакты в базе данных и как я могу прочитать данные.Я хотел бы знать эффективный способ сделать это.Так как я плохо разбираюсь с базой данных, мне поможет более точный код.Пожалуйста, помогите. enter image description here

Я попробовал приведенный ниже код, но в Firestore хранится только 800 контактов, а не 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();
    }` 

1 Ответ

1 голос
/ 14 июля 2019

Вот возможный ответ на ваш вопрос -

Во-первых, структура базы данных Firestore. Сейчас я назову это структурой БД. Вот шаблон, который может работать для вас -

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());
                }
            }
        });

Надеюсь, это поможет !!

Источники

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...