я хочу сохранить и восстановить все контакты в Firebase Firestore, нужна структура для сохранения и восстановления контактов - PullRequest
0 голосов
/ 23 июня 2019

Я занимаюсь разработкой приложения, есть функция, позволяющая получить все контакты пользователя и загрузить его на сервер. Здесь я использую Firebase Firestore в качестве своего бэкэнда. Я могу получить все контакты без дубликатов. Может кто-нибудь помочь, в какой структуре документа мне нужно сохранить контактные данные пользователя? Пожалуйста, скажите мне соответствующий формат, чтобы он не занимал много места в Firestore.

А потом ..

Как только все контакты сохранены, я должен иметь возможность получить имя контакта, используя номер, который вводит пользователь. Это мое требование. Короче говоря, я хотел бы знать, как сохранить 2500 контактных данных для Firestore и как прочитать одно имя контакта с помощью номера контакта, который пользователь вводит в тексте редактирования. (примечание: я слышал, что мы не можем сохранить 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 Ответ

2 голосов
/ 23 июня 2019
  1. Расскажите, пожалуйста, как мне сохранять данные в Firestore (структура)

Если вы используете аутентификацию, возможная схема базы данных для вашего варианта использования приложения можетбыть:

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

Чтобы получить все контакты, которые есть у пользователя, просто присоедините слушателя к ссылке на контакт:

db.collection("users").document(uid).collection("contacts");
пожалуйста, скажите мне прочитать одно имя контакта с помощью номера

Чтобы получить информацию об одном контакте с номером телефона, используйте следующий запрос:

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

В соответствии с официальной документацией относительно максимального количества документов, которое может быть добавлено в одну партию :

Каждая транзакция или партия записей может записывать максимум до500 документов.

Таким образом, вам нужно разделить свои контакты на части по 500 документов, чтобы иметь возможность добавить все эти контакты в Firestore.

Редактировать:

, если я предполагаю, что один пользователь имеет 4000 контактов в своем телефоне (только номер мобильного телефона и имя * 4000 = 8000 данных от одного пользователя).

Это неверноЕсли у вас есть только 2 свойства (в документе контакта), у вас будет только 4000 операций записи и , а не 8000, поскольку оба свойства являются частью одного и того же документа.Таким образом, вы должны записать их вместе, используя пакетную запись или класс POJO.

, если число пользователей станет 5 миллионами, это будут огромные данные, которые необходимо хранить в Firestore.

Это правильно, но в то же время это означает, что у вас будет очень успешное приложение, и вы можете позволить себе все эти операции записи.5 миллионов, поверьте мне, это очень много.

поэтому я хочу схему, которая должна быть наилучшей и должна занимать как можно меньше места

Проблема не в пространстве,проблема заключается в количестве операций чтения и записи, которые вы выполняете.Evrything в Firestore о количестве операций чтения и записи.

Я ожидаю очень эффективный способ сохранения данных.пожалуйста, помогите

По моему мнению, приведенная выше схема поможет вам решить проблему.

, учитывая, что этот ответ все же является вашим лучшим решением?

Учитывая ваш запрос на ваш вопрос и комментарии, да.

возможно ли игнорировать uid, идентификатор контакта и может иметь только эти параметры

Толькоесли вы используете базу данных реального времени Firebase , которая является другим продуктом.Нет никаких коллекций и документов, только структура базы данных JSON.

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