Я хочу синхронизировать контакты пользователя с Firebase FireStore за один раз - PullRequest
0 голосов
/ 27 августа 2018

Я создаю чат-приложение, похожее на WhatsApp. Я хочу показать список зарегистрированных пользователей приложения из списка контактов устройства пользователя при создании новой группы. Теперь, чтобы сделать это, я должен сравнить каждый контактный номер с пользователями firebase firestore. И любой обычный пользователь может иметь более 500 контактов в устройстве. Более того, у firestore есть ограничение для запросов к БД, поэтому я не могу сравнивать более одного числа за раз, весь процесс занимает почти 6-7 минут, а каждая операция чтения обходится в финансовом отношении.

Как мне преодолеть эту ситуацию или как лучше справиться с этим конкретным сценарием?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

ОП запросил структуру и некоторый код (Swift, Firebase Database) в качестве решения. Я представлю два варианта

Если вы хотите использовать Firebase Query, чтобы узнать, существуют ли номера телефонов, возможная структура будет

users
  uid_0
    contact_name: "Larry"
    contact_phone: "111-222-3333"
  uid_1
    contact_name: "Joe"
    contact_phone: "444-555-6666"

, а затем быстрый код для запроса существующих номеров

let phoneNumbers = ["111-222-3333","444-555-6666"] //an array of numbers to look for
let myQueryRef = self.ref.child("users")
for contactPhone in phoneNumbers {
    let queryRef = myQueryRef.queryOrdered(byChild: "contact_phone").queryEqual(toValue: contactPhone)
    queryRef.observeSingleEvent(of: .childAdded, with: { snapshot in
        if snapshot.exists() {
            print("found \(contactPhone)") //or add to array etc
        }
    })
}

Наличие запросов в узком цикле, как это, как правило, не рекомендуется, но обычно оно хорошо работает для меня с небольшими итерациями. Однако запросы имеют намного больше накладных расходов, чем .observers.

IMO, лучший и значительно более быстрый вариант - оставить в узле только телефонные номера. Затем переберите те, которые вы ищете, и используйте .observe, чтобы увидеть, существует ли этот узел.

phone_numbers
   111-222-3333: true
   444-555-6666: true

и затем код, чтобы увидеть, существуют ли те из массива

let phoneNumbers = ["111-222-3333","444-555-6666"] //an array of numbers to look for
let phoneNumberRef = self.ref.child("phone_numbers")
for contactPhone in phoneNumbers {
    let ref = phoneNumberRef.child(contactPhone)
    ref.observeSingleEvent(of: .value, with: { snapshot in
        if snapshot.exists() {
            print("found \(contactPhone)")
        }
    })
}

При тестировании это второе решение должно работать быстрее, чем первое.

0 голосов
/ 27 августа 2018

Вы можете хранить контакты пользователя на устройстве и отправлять их только в хранилище как резервную копию. После этого вы можете синхронизировать локальную базу данных с firestore при запуске приложения. Операции, в которых вы нуждаетесь, не могут быть надежными в пожарной базе. Даже в этом случае, если вы хотите выполнить поиск в базе данных Firebase, вам нужно использовать стороннее решение поиска, такое как Elastic Search, с вашими данными Firebase для выполнения сложного поиска.

Для локальной базы данных вы можете использовать Библиотеку комнат: https://developer.android.com/topic/libraries/architecture/room

Для использования Elastic Search с Firebase взгляните на эту утилиту Flashlight: https://github.com/FirebaseExtended/flashlight.

...