如何在Firebase(Android)中添加和查看子对象?
我有一个类似的问题,我有我的文件如下,我希望能够查看所有的子项目和添加新的子项目 我知道您将不得不修改Java文件中的代码,但我在理解如何操作自己的代码时遇到了困难,我试图遵循Firebase提供的混乱文档 下面是我的数据库结构和代码。任何帮助都将不胜感激 我现在唯一的问题是如何用数据库的以下结构的值正确地填充listview 如下所示:消息-->消息-->的值具有串联字符串 我希望这不会让人困惑 这是我的MainActivity.java如何在Firebase(Android)中添加和查看子对象?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有一个类似的问题,我有我的文件如下,我希望能够查看所有的子项目和添加新的子项目 我知道您将不得不修改Java文件中的代码,但我在理解如何操作自己的代码时遇到了困难,我试图遵循Firebase提供的混乱文档 下面是我的数据库结构和代码。任何帮助都将不胜感激 我现在唯一的问题是如何用数据库的以下结构的值正确地填充listview 如下所示:消息-->消息-->的值具有串联字符串 我希望这不会让人困惑 这是我的MainActivity.java package com.example.se
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
}
}
package com.example.sean.Messenger Appsean;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.TextView;
导入com.firebase.client.DataSnapshot;
导入com.firebase.client.firebase;
导入com.firebase.client.firebase错误;
导入com.firebase.client.Query;
导入com.firebase.client.ValueEventListener;
导入com.firebase.client.collection.ArraySortedMap;
导入com.firebase.client.realtime.util.StringListReader;
导入com.google.firebase.database.DatabaseReference;
导入com.google.firebase.database.FirebaseDatabase;
导入java.lang.reflect.Array;
导入java.util.ArrayList;
导入java.util.List;
公共类MainActivity扩展了AppCompatActivity{
//text查看mTextFieldCondition;
EditText editUsername,editValue;
ArrayAdapter ArrayAdapter;
按钮BTN发送;
Firebase mRef;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@凌驾
受保护的void onStart(){
super.onStart();
//mTextFieldCondition=(TextView)findViewById(R.id.textViewCondition);
editUsername=(EditText)findViewById(R.id.editUsername);
editValue=(EditText)findViewById(R.id.editValue);
btnSend=(按钮)findviewbyd(R.id.btnSend);
mRef=新的火基(“https://androidmessagetest.firebaseio.com/“”;//可以使用此处的代码发布到特定位置或数据库
//正在尝试设置LISTVIEW
最终ListView ListView=(ListView)findViewById(R.id.ListView);
final ArrayList msgsArray=new ArrayList();//用于填充视图
最终值EventListener ValueEventListener=mRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
//----------列出数据的条件----------------
//可能需要将值放入数组中,并按发布顺序读取它们
//String text=dataSnapshot.child(“Message”).child(“Enter Username3”).getValue(String.class);
//mTextFieldCondition.setText(文本);
//填充列表视图
对于(DataSnapshot DataSnapshot:DataSnapshot.getChildren()){
添加(Datasnapshot.child(“Messages”).child(“Message”).getKey());
}
ArrayAdapter ArrayAdapter=新的ArrayAdapter(MainActivity.this,android.R.layout.simple\u list\u item\u 1,msgsArray);
setAdapter(arrayAdapter);
}
@凌驾
取消后的公共无效(FirebaseError FirebaseError){
}
});
btnSend.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//需要将值动态更改为USERNAME:MESSAGE
String textoutput=String.valueOf(editUsername.getText());
String MessageText=String.valueOf(editValue.getText());
//修复了消息添加子项以及如何为消息添加值的问题
//稍后尝试使用以下代码发送消息
mRef.child(“Messages”).child(“Message”).push().setValue(text输出+”:“+MessageText);
}
});
//添加查找数据的函数
}
}
以下是我的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>
//在下面的代码中输入以查看数据输出
这些导入适用于旧版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。文档和示例如下所示。还有一个问题。为什么这两个SDK不能混合使用?分享上下文可能很有用,因为许多人可能会在这里登陆,希望这样做。@Kato:他们可以混合吗?我还没有真正测试过它。我的回答是基于以前的帖子(我记得)有问题。我必须回顾一下。我对Android也不确定,但如果我们能找到答案,在这里有这样的背景会很好:)我已经更新了我的Android java文件,现在可以发布,但是我在检索数据时遇到了问题。@qbix:是的,出于某种原因,我发现我可以将它们混合在一起,而且据我所知,它们完全没有问题。如果您想显示列表,我建议您使用RecyclerView。这肯定会对你有帮助:谢谢你的帮助。我已经更新了它,但无法学习如何为我的数据执行列表视图。你有什么建议吗?使用回收视图。它的实现有点复杂,但从性能上看,它将产生巨大的差异。要使用recyclerview,您需要添加一个适配器和一个视图支架。@Michele La Ferla:谢谢您的回复。我会调查的。从现在起我可以拿到