2017-11-19 2 views
0

Ich versuche herauszufinden, wie überprüft werden kann, ob sich ein bestimmter Schlüssel in meiner Firebase-Datenbank befindet. Ich benutze Xamarin und das Xamarin.Firebase.Database nugget Paket. Aus irgendeinem Grund ist dieses Paket nicht wie die restlichen Bindungen auf der Xamarin Components-Seite aufgeführt, daher gibt es keine Beispiele, die ich spezifisch für dieses Paket finden kann.Abrufen von Daten aus der Firebase-Datenbank mithilfe von Xamarin.Firebase.Database

Ich möchte überprüfen, ob ein Benutzername bereits vergeben ist.

EDIT: Neuer Code unten basierend auf der aktuellen Antwort.

//Database instance 
DatabaseReference oRoot = FirebaseDatabase.Instance.Reference.Root; 
DatabaseReference oUsernamesRef = oRoot.Child("usernames"); 


//Username isn't taken 
var userListener = new UserValueEventListener((sender, e) => 
{ 
    bool result = (e as UserEventArgs).value; 
    if (result) 
    { 
     lstErrors.Add("The username you selected already exists. Please choose a different one."); 
     txtUsername.Background = GetDrawable(Resource.Drawable.edittext_modified_states_error); 
    } 
}, sUsername); 

oUsernamesRef.OrderByChild("username").EqualTo(sUsername).AddListenerForSingleValueEvent(userListener); 
oUsernamesRef.OrderByChild(txtUsername.Text.ToLower()).EqualTo(txtUsername.Text.ToLower()).AddListenerForSingleValueEvent(oListener); 

Zuhörer:

public class UserValueEventListener : Java.Lang.Object, IValueEventListener 
{ 
    EventHandler OnChange; 
    string Username; 

    public UserValueEventListener(EventHandler OnChange, string Username) 
    { 
     this.OnChange = OnChange; 
     this.Username = Username; 
    } 

    public void OnCancelled(DatabaseError error) 
    { 
     // 
    } 

    public void OnDataChange(DataSnapshot snapshot) 
    { 
     throw new Exception("here."); 
     if (OnChange != null && snapshot.Value != null && snapshot.HasChild(Username)) 
     { 
      OnChange.Invoke(this, new UserEventArgs(true)); 

     } 
    } 
} 

Ereignis

public class UserEventArgs : EventArgs 
{ 
    public UserEventArgs(bool value) 
    { 
     this.value = value; 
    } 

    public bool value { get; set; } 
} 

Hat jemand in der Lage gewesen, dieses Paket zu verwenden und diese Arbeit zu bekommen? Jede Hilfe wird geschätzt.

Antwort

0

Hier können Sie ein POJO in Java definiert annehmen (oder Xamarin.Android-basierte C#) User genannt, die eine Name und Email Eigenschaft enthält und die Name Eigenschaft ist ein eindeutiger Schlüssel.

den folgenden Aufruf fügt zwei Benutzer, Bar und Foo zum usernames Schlüssel:

var userNamesRef = FirebaseDatabase.GetInstance(firebaseURL).GetReference(User.UserNameRoot); 
var userSendToFirebase = new User("Bar", "[email protected]"); 
var userRef = userNamesRef.Child(userSendToFirebase.Name); 
userRef.SetValue(userSendToFirebase); 
userSendToFirebase = new User("Foo", "[email protected]"); 
userRef = userNamesRef.Child(userSendToFirebase.Name); 
userRef.SetValue(userSendToFirebase); 

Sie können später Abfrage für den Bar Benutzer durch AddListenerForSingleValueEvent Verwendung für eine einmalige der Daten lesen:

var userNamesRef = FirebaseDatabase.GetInstance(firebaseURL).GetReference(User.UserNameRoot); 
var userListener = new UserValueEventListener((sender, e) => 
{ 
    var userFromFirebase = (e as UserEventArgs).Value as User; 
    Log.Debug(App.TAG, $"User Found!: {userFromFirebase.Name} : {userFromFirebase.Email}"); 
}); 
userNamesRef.OrderByChild("name").EqualTo("Bar").AddListenerForSingleValueEvent(userListener); 

Der IValueEventListener -basierte Hörer verwendet wird, ist:

public class UserValueEventListener : Java.Lang.Object, IValueEventListener 
{ 
    EventHandler OnChange; 

    public UserValueEventListener(EventHandler OnChange) => this.OnChange = OnChange; 

    public void OnCancelled(DatabaseError error) 
    { 
     Log.Warn(App.TAG, "Failed to read value:", error.ToException()); 
    } 

    public void OnDataChange(DataSnapshot snapshot) 
    { 
     if (OnChange != null && snapshot.Value != null && snapshot.Key == User.UserNameRoot) 
     { 
      foreach (DataSnapshot item in snapshot.Children.ToEnumerable()) 
      { 
       var user = item.GetValue(Java.Lang.Class.FromType(typeof(User))) as User; 
       OnChange.Invoke(this, new UserEventArgs(user)); 
      } 
     } 
    } 
} 
+0

Danke für die Antwort. Bitte sehen Sie sich meine aktualisierte Frage an, die auf Ihrem Code basiert. – Tristan

+0

@Tristan Wenn Sie feststellen möchten, ob der Benutzer ** nicht ** existiert, überprüfen Sie im 'IValueEventListener.OnDataChange', ob der' snapshot.Key' der ist, den Sie anfordern, und der 'snapshot.ChildrenCount' ist gleich Null. – SushiHangover

+0

Danke. Will, aber ich glaube auch nicht, dass der Zuhörer gefeuert wird. Diese Ausnahme in der OnChange-Funktion wird nie ausgelöst. – Tristan

Verwandte Themen