【问题标题】:Firebase - Unable to read data on application interface - Android StudioFirebase - 无法读取应用程序界面上的数据 - Android Studio
【发布时间】:2019-01-23 22:24:54
【问题描述】:

我正在使用 Firebase 在 Android Studio 上开发一个任务管理应用程序。我创建了一个类来向数据库添加数据,但我尝试了多种方法来集成和读取应用程序上的数据,但没有任何进展。

主Activity.java

database = FirebaseDatabase.getInstance();
    ref = database.getReference().child("Task List");
    final ArrayList<String> mTaskName = new ArrayList<>();

    taskListView = (ListView) findViewById(R.id.taskListView);
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, R.layout.task_info, mTaskName);
    taskListView.setAdapter(arrayAdapter);
    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            String value = dataSnapshot.getValue(String.class);
            mTaskName.add(value);
            arrayAdapter.notifyDataSetChanged();

        }

add_task.java

 mDatabase = FirebaseDatabase.getInstance().getReference().child("Task List"); // Reference database

    addTaskbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String taskName = newTask.getText().toString().trim();
            String date = dateField.getText().toString().trim();
            String assignee = spinnerAssign.getSelectedItem().toString();
            String descrip = description.getText().toString();

            if (!TextUtils.isEmpty(taskName) && !TextUtils.isEmpty(date)) {

                HashMap<String, String> taskData = new HashMap<>();
                taskData.put("Name", taskName);
                taskData.put("Date", date);
                taskData.put("Assigned to", assignee);
                taskData.put("Description", descrip);

                mDatabase.push().setValue(taskData).addOnCompleteListener(new OnCompleteListener<Void>() {

数据库的结构如下:

经理任务列表

-任务列表

-PushID
-分配给:“姓名”
-日期:“日期”
-描述:“描述”
-名称:“任务名称”

【问题讨论】:

  • “OnCompleteListener”回调是否调用成功?要实际显示数据,请尝试实现“addSingleValueEventListener”而不是“ChildEventListener”。
  • 嗨,Marco,这是你的意思吗? 'ref.addValueEventListener(new ValueEventListener() { 覆盖 public void onDataChange(NonNull DataSnapshot dataSnapshot) { for (DataSnapshot ds: dataSnapshot.getChildren()) { task = ds.getValue(Task.class); list.add(task.getName ()); }//for taskListView.setAdapter(adapter); } Override public void onCancelled(NonNull DatabaseError databaseError) { } });'
  • 如果您只需要显示列表,请使用仅触发一次的“addListenerForSingleValueEvent”(检索列表),如下所述:firebase.com/docs/android/guide/…。不要忘记调用 'notifyDataSetChanged()' 来更新本地列表。
  • 我已经实现了,但似乎并没有真正改变。我在列表视图中没有收到任何数据。此外,如果我尝试访问我的 add_task 页面,我的应用程序会崩溃。
  • 另外,为了让事情更清楚,我希望能够通过应用程序添加或不添加新数据来查看数据。

标签: java android firebase firebase-realtime-database


【解决方案1】:
 ValueEventListener eventListener = new ValueEventListener() {
        //Searching the database and adding each to list
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                //adding the key to an arraylist to be referenced when deleting records or passing intents from specific button
                mTaskName.add(ds.getKey());
                String name = ds.child("Name").getValue(String.class);
                String date = ds.child("Date").getValue(String.class);
                id.add(name  + "\n" + date);
                Log.d("TAG", name);
            }
            taskListView.setAdapter(arrayAdapter);
        }

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

        }
    };
    database.addListenerForSingleValueEvent(eventListener);

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2018-01-03
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多