【问题标题】:How to add and view child objects in Firebase (Android)?如何在 Firebase (Android) 中添加和查看子对象?
【发布时间】:2016-12-24 03:42:48
【问题描述】:

我遇到了类似的问题,我的文件如下,我希望能够查看所有子项并添加新的子项。

我知道您必须修改 Java 文件中的代码,但我无法理解如何操作自己的代码,因此我尝试按照 Firebase 提供的令人困惑的文档进行操作。

下面是我的数据库的结构,后面是我的代码。任何帮助将不胜感激。

我现在唯一的问题是如何使用我的数据库的以下结构的值正确填充列表视图。

如下:Messages --> Message --> value 有串接的字符串

我希望这不会令人困惑

这是我的 MainActivity.java

     package com.example.sean.messengerappsean;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.Query;
import com.firebase.client.ValueEventListener;
import com.firebase.client.collection.ArraySortedMap;
import com.firebase.client.realtime.util.StringListReader;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    //TextView mTextFieldCondition;
    EditText editUsername, editValue;
    ArrayAdapter arrayAdapter;
    Button btnSend;
    Firebase mRef;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        //mTextFieldCondition = (TextView) findViewById(R.id.textViewCondition);
        editUsername = (EditText) findViewById(R.id.editUsername);
        editValue = (EditText) findViewById(R.id.editValue);
        btnSend = (Button) findViewById(R.id.btnSend);
        mRef = new Firebase("https://androidmessagetest.firebaseio.com/"); //CAN USE THE CODE HERE TO PUBLISH TO SPECIFIC LOCATION OR DB
        //TRYING TO SET LISTVIEW
        final ListView listView = (ListView) findViewById(R.id.listview);
        final ArrayList<String> msgsArray = new ArrayList<String>(); //USE THIS FOR POPULATING THE VIEW






        final ValueEventListener valueEventListener = mRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {



                //----------CONDITION FOR LISTING DATA----------------
                //MIGHT NEED TO PUT VALUES INTO ARRAY AND READ THEM OUT IN ORDER OF PUBLISH
                //String text = dataSnapshot.child("Message").child("Enter Username3").getValue(String.class);
                //mTextFieldCondition.setText(text);

                //POPULATE LISTVIEW
                for (DataSnapshot Datasnapshot : dataSnapshot.getChildren()) {
                   msgsArray.add(Datasnapshot.child("Messages").child("Message").getKey());

                }

                ArrayAdapter arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, msgsArray);
                listView.setAdapter(arrayAdapter);




            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {

            }
        });

        btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //NEED TO DYNAMICALLY CHANGE VALUE TO USERNAME: MESSAGE
                String textoutput = String.valueOf(editUsername.getText());
                String MessageText = String.valueOf(editValue.getText());

                //FIXED MESSAGE ADD CHILD AND HOW TO ADD VALUE TO MESSAGE
                //TRY TO USE BELOW CODE FOR MESSAGES LATER ON

                mRef.child("Messages").child("Message").push().setValue(textoutput + ": " + MessageText);



            }
        });

        //ADD FUNCTION TO LOOK FOR DATA


    }
}

这是我的 XML 文件 activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.sean.messengerappsean.MainActivity">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <!--<TextView
            android:id="@+id/textViewCondition"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/mTextFieldCondition"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="89dp"
            android:text="Condition" />-->

        //ENTER IN CODE BELOW FOR VIEWING OUTPUT OF DATA
        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            ></ListView>

    </LinearLayout>

    <Button
        android:id="@+id/btnSend"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:text="Send" />

    <EditText
        android:id="@+id/editValue"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignTop="@+id/btnSend"
        android:layout_toLeftOf="@+id/btnSend"
        android:layout_toStartOf="@+id/btnSend"
        android:backgroundTint="@color/colorPrimaryDark"
        android:inputType="textMultiLine"
        android:text="Enter Message Here" />

    <EditText
        android:id="@+id/editUsername"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_above="@+id/btnSend"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_gravity="bottom"
        android:background="@color/colorAccent"
        android:inputType="textCapWords"
        android:text="Enter Username" />
</RelativeLayout>

【问题讨论】:

  • 如果你想显示一个列表,我建议你使用 RecyclerView。这肯定会对您有所帮助:firebase.google.com/docs/database/android/lists-of-data
  • 感谢您的帮助。我已经更新了它,但我无法学习如何为我的数据做列表视图。你有什么建议吗?
  • 使用回收站视图。实现起来有点复杂,但在性能方面,它会产生巨大的差异。要使用 recyclerview,你需要添加一个适配器和一个 viewholder。
  • @Michele La Ferla:感谢您的回复。我会调查的。
  • 到目前为止,我只能查看在数据更改时显示的消息。我必须使用以下代码来获取它,但我想显示这些值。我怎样才能在我的项目中操作代码?

标签: android firebase firebase-realtime-database


【解决方案1】:

这些导入适用于旧版 SDK 中的类:

import com.firebase.client.DataSnapshot;
import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;
import com.firebase.client.Query;
import com.firebase.client.ValueEventListener;

这些适用于新的 SDK:

import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

您不能混合使用这两个 SDK。您应该只使用新的 SDK。从您的 build.gradle 依赖项中删除此语句:

compile 'com.firebase:firebase-client-android:2.x.x'

并进行适当的代码更改以使用新的 SDK。文档和示例是here。还有一个Upgrade Guide

【讨论】:

  • 两个SDK为什么不能混用?分享上下文可能很有用,因为许多人可能会在这里寻求这样做。
  • @Kato:可以混用吗?我还没有实际测试过。我的回答是基于以前的帖子(我记得)有问题。我得复习一下。
  • 我对 Android 也不确定,但如果我们能找到的话,最好能在这里找到上下文:)
  • 我已经更新了我现在可以发布的 android java 文件,但是我在检索数据时遇到了问题。
  • @qbix:是的,出于某种原因,我发现我可以混合它们,据我所知,它们完全没问题。
猜你喜欢
  • 1970-01-01
  • 2021-03-03
  • 2017-12-16
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2021-11-23
相关资源
最近更新 更多