【问题标题】:Can't retrieve data from Firestore in onCreate无法在 onCreate 中从 Firestore 检索数据
【发布时间】:2018-07-12 10:11:53
【问题描述】:

我有一个带有 ImageView 的 Activity,它是可点击的。当我单击 ImageView 时,会出现一个对话框,其中包含 3 个选项。当我在对话框中选择 3 位置时,我调用 TimePicker,在其中指定时间并显示在 TextView 中。必须在数据库中填写的所有值都可以正常工作,它们会根据我的需要进行更新和更改。

问题是在 TimePicker 中选择时间后,它正确显示在 TextView 中,并且在数据库中输入了所需的数字,但是当我重新启动应用程序时,我需要在 TextView 中再次显示相同的数字 - 但是这个不会发生。 FireStore 中的值 - 已更改,但重新启动时在 TextView 中 - 没有。

代码:

public class ZoneOne extends AppCompatActivity implements View.OnClickListener{

private ImageView mSceneOne, mSceneTwo;
private TextView mTextOne, mTextTwo;

public static final String KEY_SCENE_ONE = "scene_one";
public static final String KEY_SCENE_TWO = "scene_two";

public static final String KEY_TIME_ONE = "time_one";
public static final String KEY_TIME_TWO = "time_two";


private FirebaseFirestore db = FirebaseFirestore.getInstance();
private DocumentReference tables = db.collection("New Collection").document("New Document");
private ArrayList mSelectedItems;
private AlertDialog.Builder builder;
private TimePickerDialog time;

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

    mSceneOne = findViewById(R.id.scene_one);
    mSceneTwo = findViewById(R.id.scene_two);

    mTextOne = findViewById(R.id.time_scene_one);
    mTextTwo = findViewById(R.id.time_scene_two);

    mTextOne.setVisibility(View.GONE);
    mTextTwo.setVisibility(View.GONE);

    mSceneOne.setOnClickListener(this);
    mSceneTwo.setOnClickListener(this);

    tables.get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot.exists()) {
                        String scene_one = documentSnapshot.getString("scene_one");
                        String one = documentSnapshot.getString("time_one");
                        switch (scene_one) {
                            case "0":
                                mTableOne.setImageResource(R.drawable.one_green);
                                break;
                            case "1":
                                mTableOne.setImageResource(R.drawable.one_red);
                                break;
                            default:
                                mTableOne.setImageResource(R.drawable.one_grey);
                                mTextOne.setText(one);
                                mTextOne.setVisibility(View.VISIBLE);
                                break;
                        }
                        String seat_two = documentSnapshot.getString("seat_two");
                        String time_for_two = documentSnapshot.getString("time_two");
                        switch (seat_two) {
                            case "0":
                                mTableTwo.setImageResource(R.drawable.two_green);
                                break;
                            case "1":
                                mTableTwo.setImageResource(R.drawable.two_red);
                                break;
                            default:
                                mTableTwo.setImageResource(R.drawable.two_grey);
                                mTextTwo.setVisibility(View.VISIBLE);
                                mTextOne.setText(time_for_two);
                                break;
                        }

                    } else {

                        Map<String, Object> allData = new HashMap<>();
                        allData.put(KEY_SCENE_ONE, "0");
                        allData.put(KEY_SCENE_TWO, "0");

                        allData.put(KEY_TIME_ONE, "");
                        allData.put(KEY_TIME_TWO, "");

                        tables.set(allData);
                    }

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                }
            });
}

private void createDialog(int state_one, int state_two, int state_three, String key, ImageView view, TextView time, String time_key) {
    mSelectedItems = new ArrayList();
    builder = new AlertDialog.Builder(this);
    final int finalState_one = state_one;
    final int finalState_two = state_two;
    final int finalState_three = state_three;
    final String KEY = key;
    final ImageView V = view;
    final TextView Time = time;
    final String TIME = time_key;

    final Map<String, Object> note = new HashMap<>();

    builder.setTitle("Please choose!")
            .setSingleChoiceItems(R.array.tables, -1,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which) {
                                case 0:
                                    mSelectedItems.add(which);
                                    break;
                                case 1:
                                    mSelectedItems.add(which);
                                    break;
                                case 2:
                                    mSelectedItems.add(which);
                                    break;
                            }


                        }
                    })
            .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    if (mSelectedItems.contains(0)){

                        V.setImageResource(finalState_one);
                        note.put(KEY, "0");
                        tables.update(note);
                        Time.setVisibility(View.INVISIBLE);

                    }else if (mSelectedItems.contains(1)){

                        V.setImageResource(finalState_two);
                        note.put(KEY, "1");
                        tables.update(note);
                        Time.setVisibility(View.INVISIBLE);

                    }else if (mSelectedItems.contains(2)){

                        V.setImageResource(finalState_three);
                        note.put(KEY, "2");
                        tables.update(note);
                        Time.setVisibility(View.VISIBLE);

                        showTimePicker(Time, TIME);
                    }



                    dialog.dismiss();

                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {

                    dialog.dismiss();

                }
            }).create();

    AlertDialog dialog = builder.create();
    dialog.show();

}

private void showTimePicker(TextView view, String key_time) {

    final TextView V = view;
    final String KEY_TIME = key_time;

    final Map<String, Object> note_time = new HashMap<>();

    final Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);
    int minute = c.get(Calendar.MINUTE);
    time = new TimePickerDialog(ZoneOne.this, new TimePickerDialog.OnTimeSetListener() {
        @SuppressLint("SetTextI18n")
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            V.setText(hourOfDay + ":" + minute);
            String time = hourOfDay + ":" + minute;
            note_time.put(KEY_TIME, time);
            tables.update(note_time);

        }
    }, hour, minute, true );
    time.show();

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.table_one:
            createDialog(R.drawable.one_green, R.drawable.one_red, R.drawable.one_grey, KEY_SCENE_ONE, mSceneOne, mTextOne, KEY_TIME_ONE);
            break;
        case R.id.table_two:
            createDialog(R.drawable.two_green, R.drawable.two_red, R.drawable.two_grey, KEY_SCENE_TWO, mSceneTwo, mTextTwo, KEY_TIME_TWO);
            break;
    }
}
}

更新: 数据库结构

【问题讨论】:

  • 请添加您的数据库结构。
  • 请不要删除和转发your question。这可能会导致自动提问。
  • @AlexMamo 更新了!
  • @AndréKool 哦,我想我没有正确理解,该怎么做。

标签: android firebase firebase-realtime-database google-cloud-firestore


【解决方案1】:

当使用类似于你的 switch 语句时:

switch (scene_one) {
    case "0":
        mTableOne.setImageResource(R.drawable.one_green);
        break;
    case "1":
        mTableOne.setImageResource(R.drawable.one_red);
        break;
    default:
        mTableOne.setImageResource(R.drawable.one_grey);
        mTextOne.setText(one);
        mTextOne.setVisibility(View.VISIBLE);
        break;
}

这意味着您仅在特定情况下将字符串one 设置为TExtView,即scene_one 不是 0 或1。正如我在您的数据库中看到的,您的scene_one 属性的值是0,这意味着永远不会到达default case。如果要设置TextView,无论是哪种情况,都需要在每种情况下复制这些代码行,case "0" 和case "1"。

【讨论】:

  • 好的@Alex Mamo,我理解你。我尝试在任何地方替换此字符串,尝试使用所有逻辑变体,但问题不在于此。我启动应用程序 - 在 TimePicker 中设置时间 - 它出现在 TextView 中 - 然后我退出应用程序并再次启动。当我重新启动应用程序时,在Oncreate 中,我尝试显示那个时间,那是在TextView,现在在Firestore,但TextView 是空的。当我再次选择时间时,一切都很好,时间更新 - 一切正常。但是再次重新启动后,我的TextView 是空的。
  • 我理解你,但问题仍然存在于你的 switch 语句中。尝试在你的数据库中给scene_one 赋值三,现在可以了吗?
  • 感谢@Alex Mamo,但我并不清楚我的逻辑有什么错误。时间必须出现,只有当我的case = 2,而不是0 或1。我写了这个,那个时间必须设置在TextView并且是可见的,只有当case不等于0或1时。所有的工作都像你说的那样,但你能解释一下吗?
  • 这就是 switch 语句的工作方式。您应该每次都检查您用于案例的所有值。
【解决方案2】:
    tables.get()
                .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                    @Override
                    public void onSuccess(DocumentSnapshot documentSnapshot) {
                        if (documentSnapshot.exists()) {
                            String scene_one =  documentSnapshot.getString("scene_one");
                            String one = documentSnapshot.getString("time_one");

                            mTextOne.setText(one);
                            mTextOne.setVisibility(View.VISIBLE);
//Try to set the text here above switch and see if it works
                            switch (scene_one) {
                                case "0":
                                    mTableOne.setImageResource(R.drawable.one_green);
                                    break;
                                case "1":
                                    mTableOne.setImageResource(R.drawable.one_red);
                                    break;
                                default:
                                    mTableOne.setImageResource(R.drawable.one_grey);

                                    break;
                            }
                            String seat_two = documentSnapshot.getString("seat_two");
                            String time_for_two = documentSnapshot.getString("time_two");
                            switch (seat_two) {
                                case "0":
                                    mTableTwo.setImageResource(R.drawable.two_green);
                                    break;
                                case "1":
                                    mTableTwo.setImageResource(R.drawable.two_red);
                                    break;
                                default:
                                    mTableTwo.setImageResource(R.drawable.two_grey);
                                    mTextTwo.setVisibility(View.VISIBLE);
                                    mTextOne.setText(time_for_two);
                                    break;
                            }

                        } else {

                            Map<String, Object> allData = new HashMap<>();
                            allData.put(KEY_SCENE_ONE, "0");
                            allData.put(KEY_SCENE_TWO, "0");

                            allData.put(KEY_TIME_ONE, "");
                            allData.put(KEY_TIME_TWO, "");

                            tables.set(allData);
                        }

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                    }
                });

【讨论】:

    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多