addValueEventListener adds a ValueEventListener to a DatabaseReference.
ValueEventListener reads and listens for changes to the entire contents of a path.
DataSnapshot instance contains data from a Firebase Database location.
Any time you read Database data, you receive the data as a DataSnapshot.
The method onDataChange will be called with a snapshot of the data at this location.
It will also be called each time that data changes.
getValue is used to marshall the data contained in this snapshot into a class of your choosing.
getSupportActionBar retrieves a reference to this activity’s ActionBar, which appears at the top of an activity’s window when the activity uses the AppCompat’s AppCompat theme.
| MyFirebase\app\java\com\wenchen\myfriebase\MainActivity.java |
package com.wenchen.myfirebase
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
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 {
private static final String TAG = MainActivity.class.getSimpleName( );
private TextView txtDetails;
private EditText inputName, inputEmail;
private Button btnSave;
private DatabaseReference mFirebaseDatabase;
private FirebaseDatabase mFirebaseInstance;
private String userId;
@Override
protected void onCreate( Bundle savedInstanceState ) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
// Displaying toolbar icon
getSupportActionBar( ).setDisplayShowHomeEnabled( true );
getSupportActionBar( ).setIcon( R.mipmap.ic_launcher );
txtDetails = (TextView) findViewById( R.id.txt_user );
inputName = (EditText) findViewById( R.id.name );
inputEmail = (EditText) findViewById( R.id.email );
btnSave = (Button) findViewById( R.id.btn_save );
mFirebaseInstance = FirebaseDatabase.getInstance( );
// Getting reference to 'users' node
mFirebaseDatabase = mFirebaseInstance.getReference( "users" );
// Storing app title to 'app_title' node
mFirebaseInstance.getReference( "app_title" ).setValue( "Realtime Database" );
// app_title change listener
mFirebaseInstance.getReference( "app_title" ).addValueEventListener(
new ValueEventListener( ) {
@Override
public void onDataChange( DataSnapshot dataSnapshot ) {
Log.e( TAG, "App title updated" );
String appTitle = dataSnapshot.getValue( String.class );
// Updating toolbar title
getSupportActionBar( ).setTitle( appTitle );
}
@Override
public void onCancelled( DatabaseError error ) {
// Failed to read value
Log.e( TAG, "Failed to read app title value.", error.toException( ) );
}
}
);
// Saving or updating the user
btnSave.setOnClickListener(
new View.OnClickListener( ) {
@Override
public void onClick( View view ) {
String name = inputName.getText( ).toString( );
String email = inputEmail.getText( ).toString( );
// Checking for already existed userId
if ( TextUtils.isEmpty( userId ) ) createUser( name, email );
else updateUser( name, email );
}
}
);
toggleButton( );
}
// Changing button text
private void toggleButton( ) {
if ( TextUtils.isEmpty( userId ) ) btnSave.setText( "Save" );
else btnSave.setText( "Update" );
}
//
// Creating new user node under 'users'
//
private void createUser( String name, String email ) {
// TODO
// In real apps this userId should be fetched by using auth
if ( TextUtils.isEmpty( userId ) )
userId = mFirebaseDatabase.push( ).getKey( );
User user = new User( name, email );
mFirebaseDatabase.child( userId ).setValue( user );
addUserChangeListener( );
}
//
// User data change listener
//
private void addUserChangeListener( ) {
mFirebaseDatabase.child( userId ).addValueEventListener(
new ValueEventListener( ) {
@Override
public void onDataChange( DataSnapshot dataSnapshot ) {
User user = dataSnapshot.getValue( User.class );
// Check for null
if ( user == null ) {
Log.e( TAG, "User data is null!" );
return;
}
Log.e( TAG, "User data is changed!" + user.name + ", " + user.email );
// Displaying newly updated name and email
txtDetails.setText( user.name + ", " + user.email );
// Clearing edit text
inputEmail.setText( "" );
inputName.setText ( "" );
toggleButton( );
}
@Override
public void onCancelled( DatabaseError error ) {
// Failed to read value
Log.e( TAG, "Failed to read user", error.toException( ) );
}
}
);
}
private void updateUser( String name, String email ) {
// Updating the user via child nodes
if ( !TextUtils.isEmpty( name ) )
mFirebaseDatabase.child( userId ).child( "name" ).setValue( name );
if ( !TextUtils.isEmpty( email ) )
mFirebaseDatabase.child( userId ).child( "email" ).setValue( email );
}
}
|
|
“Madame, all stories, if continued far enough, end in death, and he is no true-story teller who would keep that from you.” ― Hemingway, Ernest |