android - 如何获取 firebase 数据库的实时更新?

标签 android firebase firebase-realtime-database

我正在尝试从我的 firebase 数据库中获取单个字符串。虽然我没有看到任何错误,但是当我更改数据时,它没有反射(reflect)出来。我只想在 firebase 中在线存储一个字符串,然后再检索它。 我正在为一个安卓应用程序做这个。这是 MainActivity 的代码。请告诉我哪里出错了。

package sadboy.firebase;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

[public class MainActivity extends AppCompatActivity {][1]

private TextView title;
private DatabaseReference mFirebaseDatabase;
private FirebaseDatabase mFirebaseInstance;

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

    title = (TextView)findViewById(R.id.title);
    mFirebaseInstance = FirebaseDatabase.getInstance();

    mFirebaseDatabase = mFirebaseInstance.getReference("hey");
    mFirebaseInstance.getReference("new_title").setValue("Realtime Database");
    mFirebaseInstance.getReference("new_title").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String appTitle = dataSnapshot.getValue(String.class);
            Log.e("Hey", appTitle);
            title.setText(appTitle);
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.e("Hey", "Failed to read app title value.", error.toException());
        }
    });


}
}

enter image description here

在这里找到项目: https://github.com/heysadboy/Firebase-Sample

最佳答案

尝试使用这种方法:

public class MainActivity extends AppCompatActivity {

    private TextView title;
    private DatabaseReference mFirebaseDatabase;
    private FirebaseDatabase mFirebaseInstance;

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

        title = (TextView) findViewById(R.id.title);

        mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseDatabase = mFirebaseInstance.getReference();

        mFirebaseDatabase.child("new_title").setValue("Realtime Database");
        mFirebaseDatabase.child("new_title").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String appTitle = dataSnapshot.getValue().toString();
                Log.e("Hey", appTitle);
                title.setText(appTitle);
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.e("Hey", "Failed to read app title value.", error.toException());
            }
        });
    }
}

编辑

为了更容易测试代码,我对您的布局做了细微的更改。以下是我所做的更改:

activity_main.xml

我添加了一个 EditText 和 Button。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    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="sadboy.firebase.MainActivity">

    <EditText
        android:id="@+id/et_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:inputType="text" />

    <Button
        android:id="@+id/bt_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/activity_vertical_margin"
        android:text="SEND" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

MainActivity.java

单击“发送”按钮后,我从 EditText 中取出字符串并将其作为 new_title 值存储在您的 Firebase 数据库中,同时收听在 new_title 中所做的更改并显示TextView 的值。

public class MainActivity extends AppCompatActivity {

    private TextView title;
    private EditText etInput;
    private Button btSend;
    private DatabaseReference mFirebaseDatabase;

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

        title = (TextView) findViewById(R.id.title);
        etInput = (EditText) findViewById(R.id.et_input);
        btSend = (Button) findViewById(R.id.bt_send);

        mFirebaseDatabase = FirebaseDatabase.getInstance().getReference();

        btSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String valuetoSend = etInput.getText().toString();
                mFirebaseDatabase.child("new_title").setValue(valuetoSend);
            }
        });

        mFirebaseDatabase.child("new_title").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String appTitle = dataSnapshot.getValue().toString();
                title.setText(appTitle);
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.e("Hey", "Failed to read app title value.", error.toException());
            }
        });
    }
}

结果如下:

enter image description here

关于android - 如何获取 firebase 数据库的实时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42050057/

相关文章:

Android 和 NDK/库

android - firebase 云消息传递中*未送达*消息的数量是否有限制?

android - 尽管是 "clickable",但单击时 TextView 不提供反馈

swift - 我可以改进我的 Firebase 结构吗?

javascript - 使用 Javascript 将数据格式化为 Firebase

node.js - 尝试访问实时数据库时 Firebase Node.js 管理 SDK 超时

java - 如何设置标题和段落间距?

firebase - 如何调试 Firebase 安全规则/权限

node.js - 如何处理 'promis'的数组

ios - 如何删除tableview、coredata、firebase数据库中的数据,删除顺序?