如何将检索到的数据从Firebase保存到Android中的字符串变量?

时间:2018-09-16 12:49:28

标签: java android firebase firebase-realtime-database

Hy Developers ,我是android开发的新手,所以这就是为什么将数据保存和查看到我的android应用程序中的问题

我知道只有在您连接到互联网时才能检索数据。

但是问题是它正在检索数据并向Android日志显示。

  

但是当我尝试将其保存到字符串变量或arraylist以显示时   使用该列表或变量将其用于主要活动,则无法正常工作。

我要声明一个私有字符串变量,以便在onCreate方法之前存储Firebase数据库中的值。

很抱歉我的nob问题。但这是我面临的问题。

以下是我正在使用的代码和一些屏幕截图,使问题易于理解。

public class MainActivity extends AppCompatActivity {

private static final String TAG = "Firelog" ;

Button ans1, ans2, ans3, ans4;

TextView uscore, question, timer;

private String mAnswer;

private ArrayList<String> fbquestions = new ArrayList<String>();

private String quest;

private int mScore = 0;

Random r = new Random();

private int res = 0;

private int c = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    uscore = (TextView) findViewById(R.id.uscore);
    question = (TextView) findViewById(R.id.question);
    timer = (TextView) findViewById(R.id.timer);

    ans1 = (Button) findViewById(R.id.ans1);
    ans2 = (Button) findViewById(R.id.ans2);
    ans3 = (Button) findViewById(R.id.ans3);
    ans4 = (Button) findViewById(R.id.ans4);

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("mcqs");

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Map <String, String> map = (Map)dataSnapshot.getValue();
            quest = map.get("question");

            fbquestions.add(quest);

            Log.v("E_Value","Question is" + quest);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    question.setText(String.valueOf(fbquestions.get(0)));
  }
}

enter image description here

在上面的图片中,您可以看到问题已从Firebase成功检索并在日志中可见。

enter image description here

但是在这里,当我分配后尝试在主屏幕上显示问题时,其显示为空白。

enter image description here

添加代码以将值添加到arraylist后,应用程序崩溃。

2 个答案:

答案 0 :(得分:1)

您不能简单地在fbquestions.get(0)方法之外获取onDataChange()的值,因为该方法具有异步行为。因此,您不能简单地将fbquestions列表创建为全局变量并在callbakc之外使用它的值,因为它始终是empty。基本上,您正在尝试从异步的API同步使用值。那不是一个好主意。您应该按预期异步处理API。

对此问题的快速解决方案是移动以下代码行:

question.setText(String.valueOf(fbquestions.get(0)));

在此代码行之后的回调内:

Log.v("E_Value","Question is" + quest);

您的问题将得到解决。如果要在外部使用列表,建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。

答案 1 :(得分:0)

将任务值传递给Textview。

ArrayList<String> questionArrrayList =new Arraylist<>();
questionArrrayList .clear();

   myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Map <String, String> map = (Map)dataSnapshot.getValue();
            quest = map.get("question");
             question.setText(quest);


                questionArrrayList .add(quest);
                Log.v("E_Value","Question is" + quest);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });