2016-12-15 127 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); 
} 
相关问题