2016-06-04 8 views
0

Ich schreibe eine App, in der ein angemeldeter Benutzer sehen kann, welche seiner Kontakte ebenfalls angemeldet sind. Was ist der eleganteste Weg, dies zu tun?Firebase: Wie kann ich registrierte Kontakte identifizieren?

enter image description here

Ich hatte geplant, ein Array aller lokal gespeicherten E-Mail-Adressen aus dem iOS-Adressbuchs des Benutzers lokalen extrahiert zu erstellen und eine Abfrage für diejenigen zu schaffen. Gibt es einen besseren Weg, dies zu tun?

Bearbeiten: Ist das tatsächlich möglich, ohne die gesamte user Liste herunterzuladen? Ich könnte eine For-Schleife mit queryStartingAtValue(emailAddress) und queryEndingAtValue(emailAddress) verwenden. Dies könnte jedoch möglicherweise zu Hunderten von Abfragen gleichzeitig führen.

+0

anmelden Sie meinen, dass auch ein Konto erstellt? – Ymmanuel

+0

Ja. Ein Benutzer erstellt ein Konto und speichert auch seine E-Mail und seinen Benutzernamen wie oben in der Datenbank angezeigt. – MJQZ1347

+0

Diese Kontaktliste ist lokal oder ist sie in Firebase gespeichert? – Ymmanuel

Antwort

2

In NoSQL-Datenbanken modellieren Sie die Daten oft so, wie Ihre Anwendung sie verwenden möchte.

In diesem Fall scheint Ihre App basierend auf ihrer E-Mail-Adresse nachsehen zu müssen, ob ein Nutzer existiert. Zu diesem Zweck würde ich eine Liste von E-Mail-to-uid Daten hinzufügen:

emailToUid 
    "[email protected],com": "P0...wklsh1" 
    "MJQZ1347": "Aj1278a..." 

Dies ist im Wesentlichen ein selbst erstellter Index, den Ihnen, ob eine E-Mail-Adresse verwendet, um zu überprüfen ermöglicht wird, ohne eine Abfrage auszuführen zu haben.

Jetzt können Sie eine Schleife über den Kontakt und schauen, ob ein Benutzer für diese E-Mail-Adresse mit a:

ref.child("emailToUid").child(email).observeSingleEventOfType(.Value 

Diese sehr schnell sein wird. Aufgrund der Art und Weise, wie Firebase mit dem Back-End kommuniziert, wird es kaum Unterschiede zwischen einer einzelnen Anfrage mit 100 E-Mail-Adressen oder 100 Anfragen mit einer einzigen E-Mail-Adresse geben. Siehe meine Antwort hier für mehr darüber: Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly

+0

Danke! Das sieht ziemlich vielversprechend aus. Ich werde es versuchen und es dann als akzeptierte Antwort markieren. – MJQZ1347

+0

Arbeitete einwandfrei. Ich fügte auch Regeln hinzu, so dass "emailToUid" nicht lesbar ist, aber seine Kinder sind, um das Abrufen einer Liste aller registrierten E-Mail-Adressen zu verhindern. Eine einzige bekannte E-Mail kann jedoch noch auf ihre Existenz überprüft werden: Siehe Kato's Antwort hier: http://stackoverflow.com/questions/22078531/how-to-find-out-if-an-email-is-ready-registered-with -firebase-simple-login – MJQZ1347

+1

E-Mail kann leider nicht als Schlüssel verwendet werden. Wie bist du daran vorbei gekommen? –

0

könnten Sie haben so etwas wie diese

user 
    -$user_id 
     -email 
     -username 
     -contacts 
     -contact_uid1:email1, 
     -contact_uid2:email2, 
     -contact_uid3:email3, 

Und dann tun:

  1. den Kontakt Kind von Firebase herunterladen und es auf einen var speichern

  2. die Schleife erstellen zu überprüfen Jeder Kontakt im Adressbuch

  3. Wenn th e E-Mail in dem Kontakt Kind ist nichts tun (es bedeutet, dass Sie den Benutzer bereits einmal überprüft)

  4. Wenn die E-Mail eine einzelnes Ereignis Abfrage nicht in dem Kontakt Kind starten ist es, die uid einer bestimmten E-Mail finden

  5. in den Rückruf der Abfrage, ob es nsnull den Benutzer ist nicht in der App , wenn der Benutzer vorhanden ist, fügen Sie den Benutzer an Ihre Kontakte untergeordneten Knoten in Feuerbasis

auf diese Weise können die einzige starten Abfragen der Kontakte, die Sie nicht überprüft haben

Verwandte Themen