2017-11-19 18 views
0

Firebaseデータベースに特定のキーがあるかどうかを確認する方法を理解しようとしています。私はXamarinとXamarin.Firebase.Databaseナゲットパッケージを使用しています。なんらかの理由で、このパッケージは他のバインディングと同様にXamarin Compenentsページには表示されないため、このパッケージ固有の例はありません。Xamarin.Firebase.Databaseを使用してFirebaseデータベースからデータを取得する

ユーザー名が既に使用されているかどうかを確認する必要があります。

EDIT:下記の新しいコードは、現在の回答に基づいています。

//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); 

リスナー:

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

     } 
    } 
} 

イベント

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

    public bool value { get; set; } 
} 

は、誰もがこのパッケージを使用してこの作業を取得することができていますか?どんな助けもありがとうございます。

答えて

0

は、Java(またはXamarin.AndroidベースのC#)で定義されたPOJONameEmailプロパティが含まれており、Nameプロパティが一意のキーであるUserと呼ばれていると仮定します。次の呼び出し

2人のユーザー、usernamesキーにBarFooを追加します。

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

あなたができるデータの読み込み1回限りのためAddListenerForSingleValueEventを使用して、Barユーザーのために、後でクエリ:

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

使用されてIValueEventListenerベースのリスナーがある:

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

お返事ありがとうございます。あなたのコードに基づいて私の更新された質問を見てください。 – Tristan

+0

@Tristan 'IValueEventListener.OnDataChange'で' not snap ** 'が存在するかどうかを判断しようとしている場合、 'snapshot.Key'があなたが要求しているものであり、' snapshot.ChildrenCount'が0に等しい。 – SushiHangover

+0

ありがとうございます。やりますが、私はリスナーが解雇されているとは思わない。 OnChange関数の例外はスローされません – Tristan

関連する問題