2016-12-15 171 views
1

我正在玩Firebase和Android,並將我的數據在線存儲在Firebase中。我有一個3 EditTexts和一個按鈕的活動,我希望它基本上檢查文本框中的3個值是否在數據庫中,如果是這樣,轉到下一個活動。檢測Firebase是否已從Android數據庫中讀取數據?

這些值是靜態的,所以我使用.addListenerForSingleValueEvent方法並將其用作匿名函數。即使設備處於脫機狀態,我也希望它能夠正常工作,但如果有任何值返回爲空,那麼我希望它拒絕移動到下一個活動。

有什麼方法可以檢測Firebase何時從數據庫中檢索到值或從數據庫中檢索到null?通過這種方式,我可以連續檢查每個值,如果返回null,則拒絕更改活動。

我唯一能想到的其他事情就是爲每個聽衆嵌套匿名函數,但這聽起來像是一個壞主意。

任何意見將不勝感激。謝謝!

+0

而不是描述代碼和問題,編輯您的問題,以包括[最小代碼重現問題](http://stackoverflow.com/help/mcve)。這將大大提高獲得可回答問題的機會。 –

+0

@FrankvanPuffelen對不起,我現在試着做些什麼 – procinct

+0

這聽起來像你會希望這三個字段存儲在同一個節點下。然後通過一次addListenerForSingleValueEvent調用,您可以檢索包含三個字段的映射,然後進行您的比較客戶端。如果您包含代碼,我很樂意向您展示如何優雅地進行操作。 –

回答

0

那麼,我明白你想在你轉到下一個活動之前檢查數據庫中的值。我的建議是,

1)創建一個DatabaseReference的ArrayList,指向您的活動中的Firebase中的數據位置。

Arraylist<DatabaseReference> list = new ArrayList<>(); 
list.add(FirebaseDatabase.getInstance().getReference().child("my_child_node_1"): 
list.add(FirebaseDatabase.getInstance().getReference().child("my_child_node_2"): 
list.add(FirebaseDatabase.getInstance().getReference().child("my_child_node_3"): 

2)創建接口和回調方法。

public static interface DataCallback { 
    static void onDataAdded(String string); //Use the necessary data type 
} 

3)使用接口爲您的Event偵聽器創建構造函數。

public static class DataListener implements ValueEventListener { 

    private DataCallback dataCallback; 

    public DataListener(DataCallback dataCallback) { 
     this.dataCallback = dataCallback; 
    } 

    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
      String data = snapshot.getValue(String.class); 

     //This is step 4 
     if(dataCallback!=null) { 
      dataCallback.onContactAdded(data); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
} 

4)從聽者的值傳遞至活動內部onDataChange()監聽器

if(dataCallback!=null) { 
     dataCallback.onContactAdded(data); 
    } 

5的方法,如下所示)實現在活動的界面並覆蓋其回調方法

public class MyActivity extends AppCompatActivity implements DataCallback{ 

private EditText edittext1; 
private EditText edittext2; 
private EditText edittext3; 
private ArrayList<String> my_list; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //do stuff... 
    } 

    @Override 
    public void onDataAdded(String data) { 

    } 
} 

6)實例並在活動的增加的onResume聽衆()方法

@Override 
public void onResume(){ 
    super.onResume(); 
    DataListener listener = new DataListener(this); 
    list[0].addListenerForSingleValueEvent(listener); 
    list[1].addListenerForSingleValueEvent(listener); 
    list[2].addListenerForSingleValueEvent(listener); 
} 

7)得到的回調方法裏面的活動從火力值如下

@Override 
public void onDataAdded(String data){ 
my_list.add(data); 
} 

8),你可以檢查是否值從火力比賽得到了來自EditText上得到的OnClicklistener內的數值爲你按鈕。

if (button != null) { 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(my_list.contains(edittext1.getText().toString)){ 
        if(my_list.contains(edittext.getText().toString)){ 
         if(my_list.contains(edittext.getText().toString)){ 
         startActivity(new intent(MyActivity.this, NextActivity.class)) 
         } 
        } 
       } 
      } 
     }); 
    } 

9)刪除onPause()方法中的監聽器。

@Override 
public void onPause(){ 
    super.onPause(); 
    list[0].removeEventListener(listener); 
    list[1].removeEventListener(listener); 
    list[2].removeEventListener(listener); 
} 
相關問題