Firebase RealTime Database Notes

 useful videos/Blogs :

https://youtu.be/T5P2jn75G6g

https://firebase.google.com/docs/database/android/read-and-write?authuser=0

Firebase database structure : https://youtu.be/T5P2jn75G6g





---------------------------------------------------------------------------------------------

IMPORTANT POINTS  for FIREBASE REALTIME DATABASE :


Firebase realtime database is a Key-Value based NO-SQL database.It stores data in the form of JSON tree , which means that the entire database is a single Json object.

This Json tree consists of Parent nodes and Child nodes,whenever we would be inserting data into the database we would be either adding a node to the database or updating an existing node. Each node has a Key and a Value associated.

The Keys are mostly strings whereas the Values associated with that Keys can be String,Int, etc or even a new Child node.

NOTE : Two keys at the same context cannot have same values.


Users is a parent node of User1 and firstname/lastname are child of User1 and User2.
The Top most node is called Root Node.

NOTE : You can also get all the json data by using the link provided by firebase & use it as a rest api. Just put ".json" at the end of the link. In our case it would be like this : https://exampleapp4-default-rtdb.firebaseio.com/.json

You can also get specific data from the json tree by modifiying the url link : Below is the link that will get us User1's json data.

https://exampleapp4-default-rtdb.firebaseio.com/Users/User1/.json


During Data fetching Data in Most cases is returned as HashMaps inside a DataSnapshot Object.


All Database operations are done on the Background thread by the Firebase itself.


Be Carreful with Event Listeners , make sure that one location has only one event listener attached on it ( For more Watch ) - https://youtu.be/tjX1TrHRuIs

( check addChildEventListner() Blog Below)



---------------------------------------------------------------------------------------------



SIMPLE INSERT OPERATION TO FIREBASE REALTIME DATABASE


After you have connected your app with your firebase & added all the required dependencies.

All you have to do is Create  object of database class & database reference class.



package com.deepesh.firebaselearningapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {

EditText editText;
Button button1;
TextView textview1;

// Gets reference to entire Database.
FirebaseDatabase firebaseDatabase;

// Gets reference to specific Node , where to READ/WRITE data
DatabaseReference databaseReference;

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


editText=findViewById(R.id.editText1);

button1=findViewById(R.id.button1);

textview1=findViewById(R.id.textView1);

firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference=firebaseDatabase.getReference();

// getReference() - gives reference to root node of database.
// getReference(String) - gives reference to specified node.

}

//button click function
public void RunCode(View view) {

String text = editText.getText().toString();
databaseReference.setValue(text);

Toast.makeText(this, "DATA INSERTED !", Toast.LENGTH_SHORT).show();
Log.d("TAG", "RunCode: DATA INSERTED");

}
}


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="73dp"
android:ems="10"
android:hint="Enter data..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="42dp"
android:text="Ready to code"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText1" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="42dp"
android:layout_marginBottom="35dp"
android:onClick="RunCode"
android:text="Cick"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>


SUCESS & FAILURE EVENT LISTENER 



//button click function
public void InsertData(View view) {

String text = editText.getText().toString();

// Gets a reference to any specified child node inside the
// Parent node reference specified inside getReference()
// Creates one if not present & sets value.
databaseReference.child("user1").setValue(text)

// EXECUTED ON SUCESSFUL INSERTION

.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {

Log.d("TAG", "RunCode: DATA INSERTED");

}
})

// EXECUTED ON UN-SUCESSFUL INSERTION

.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {

Log.d("TAG", "FAILURE : " + e.getMessage());

}
});


}




------------------------------------------------------------------------------------------------------


SIMPLE READ OPERATION TO FIREBASE REALTIME DATABASE


We use the Event Listeners to read the data.

Two Common listner are -  addValueEventListener() & addListenerForSingleValueEvent( ).





package com.deepesh.firebaselearningapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
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 {

EditText editText;
Button insertbutton,readbutton;
TextView textview1;

// Gets reference to entire Database.
FirebaseDatabase firebaseDatabase;

// Gets reference to specific Node.
DatabaseReference databaseReference;

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


editText=findViewById(R.id.editText1);

insertbutton=findViewById(R.id.insert_button);
readbutton=findViewById(R.id.read_button);

textview1=findViewById(R.id.textView1);

firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference=firebaseDatabase.getReference();

// getReference() - gives reference to root node of database.
// getReference(String) - gives reference to specified node.

}

//button click function
public void InsertData(View view) {

String text = editText.getText().toString();
databaseReference.setValue(text);

Toast.makeText(this, "DATA INSERTED !", Toast.LENGTH_SHORT).show();
Log.d("TAG", "RunCode: DATA INSERTED");

}

//button click function
public void ReadData(View view) {

// addValueEventListener is called whenever value at given reference node is changed.
// onDataChange() is passed the latest data.
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

// we are taking string so pass a "String" class.
String data = snapshot.getValue(String.class);
textview1.setText(data);
}

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

}
});

}
}


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<EditText
android:id="@+id/editText1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="73dp"
android:ems="10"
android:hint="Enter data..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="42dp"
android:text="Ready to code"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editText1" />

<Button
android:id="@+id/insert_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="42dp"
android:layout_marginBottom="36dp"
android:onClick="InsertData"
android:text="Insert"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/read_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="54dp"
android:layout_marginBottom="36dp"
android:text="Read"
android:onClick="ReadData"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>


EXAMPLE 2 : 


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<EditText
android:id="@+id/firstname_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="210dp"
android:layout_marginBottom="207dp"
android:hint="Enter Firstname"
app:layout_constraintBottom_toBottomOf="@+id/button1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/lastname_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="51dp"
android:hint="Enter lastname"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/firstname_editText" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="108dp"
android:text="Hello World !"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="120dp"
android:layout_marginBottom="46dp"
android:onClick="InsertData"
android:text="Insert Data"
app:layout_constraintBottom_toTopOf="@+id/button2"
app:layout_constraintStart_toStartOf="@+id/lastname_editText" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="7dp"
android:layout_marginBottom="101dp"
android:onClick="ReadData"
android:text="Read Data"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/button1" />

</androidx.constraintlayout.widget.ConstraintLayout>



package com.deepesh.exampleapp4;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
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;

import java.util.Map;

public class MainActivity extends AppCompatActivity {

TextView textview1;
EditText firstname_edittext;
EditText lastname_edittext;
DatabaseReference databaseReference;

final String ROOT_NODE = "Users";

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

textview1 = findViewById(R.id.textView1);
firstname_edittext = findViewById(R.id.firstname_editText);
lastname_edittext = findViewById(R.id.lastname_editText);

databaseReference = FirebaseDatabase.getInstance().getReference(ROOT_NODE);

}

// Button onClick() function
public void InsertData(View view) {

String fname = firstname_edittext.getText().toString();
String lname = lastname_edittext.getText().toString();
// Creating a new User
databaseReference.child("User3").child("firstname").setValue(fname);
databaseReference.child("User3").child("lastname").setValue(lname);

Log.d("TAG", "InsertData: DATA INSERTED SUCESSFULLY !");

}


// Button onClick() function
public void ReadData(View view) {

databaseReference.child("User3").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

// retusn data as hashmap
Map<String, Object> data = (Map<String, Object>) snapshot.getValue();

String fname = (String) data.get("firstname");
String lname = (String) data.get("lastname");

textview1.setText("FIRSTNAME : " + fname + " LASTNAME : " + lname);

}

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

}
});

}
}


// Unlike addValueEventListner() which is called everytime the value changes,
// addListenerForSingleValueEvent() is called only when we call it.





-------------------------------------------------------------------------------------------------


useful video : https://youtu.be/r_LREdNw6p4


SIMPLE CREATE  &  WRITE / READ  A CHILD NODE 


(UI  same as above)


package com.deepesh.firebaselearningapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
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 {

EditText editText;
Button insertbutton,readbutton;
TextView textview1;

// Gets reference to entire Database.
FirebaseDatabase firebaseDatabase;

// Gets reference to specific Node.
DatabaseReference databaseReference;

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


editText=findViewById(R.id.editText1);

insertbutton=findViewById(R.id.insert_button);
readbutton=findViewById(R.id.read_button);

textview1=findViewById(R.id.textView1);

firebaseDatabase = FirebaseDatabase.getInstance();
databaseReference=firebaseDatabase.getReference();

// getReference() - gives reference to root node of database.
// getReference(String) - gives reference to specified node.

}

//button click function
public void InsertData(View view) {

String text = editText.getText().toString();

// Gets a reference to any specified child node inside the
// Parent node reference specified inside getReference()
// Creates one if not present & sets value.
databaseReference.child("user1").setValue(text);

Toast.makeText(this, "DATA INSERTED !", Toast.LENGTH_SHORT).show();
Log.d("TAG", "RunCode: DATA INSERTED");

}

//button click function
public void ReadData(View view) {

// Unlike addValueEventListner() which is called everytime the value changes,
// addListenerForSingleValueEvent() is called only when we call it.

databaseReference.child("user1").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

// we are taking string so pass a "String" class.
String data = snapshot.getValue(String.class);
textview1.setText(data);
}

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

}
});

}
}





@Override
protected void onDestroy() {
super.onDestroy();

// IMPORTANT - other wise may cause Memory Leaks !
databaseReference.child("user1").removeEventListener(listener);
}



--------------------------------------------------------------------------------------------


INSERT & READ MULTIPLE CHILD NODES

   







package com.deepesh.firebaselearningapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
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;

import java.util.Map;


public class MainActivity extends AppCompatActivity {

EditText age_editText;
EditText name_editText;
TextView textview1;
DatabaseReference databaseReference;

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


age_editText = findViewById(R.id.age_editText);
name_editText = findViewById(R.id.name_editText);
textview1 = findViewById(R.id.textView1);

//Gets reference to the "users" Node
databaseReference = FirebaseDatabase.getInstance().getReference("users");

}

//button click function
public void InsertData(View view) {

String name = name_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());


// Gets reference to specified child node under "users" node
// Creates one if not found.
databaseReference.child("user1").child("Name").setValue(name);
databaseReference.child("user1").child("Age").setValue(age);


Log.d("TAG", "DATA INSERTED !");
}

//button click function
public void ReadData(View view) {


databaseReference.child("user1").addListenerForSingleValueEvent(new ValueEventListener() {

// RETURNS A OBJECT CONTAINING A SINGLE HASHMAP
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Map<String, Object> data = (Map<String, Object>) snapshot.getValue();

Log.d("TAG", "NAME : " + data.get("Name"));
Log.d("TAG", "AGE : " + data.get("Age"));
}

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

}
});
}


}



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<EditText
android:id="@+id/age_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:ems="10"
android:hint="Enter age..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name_editText" />

<EditText
android:id="@+id/name_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:ems="10"
android:hint="Enter name..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="72dp"
android:text="Ready to code"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/age_editText" />

<Button
android:id="@+id/insert_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="42dp"
android:layout_marginBottom="38dp"
android:onClick="InsertData"
android:text="Insert"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/read_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="54dp"
android:layout_marginBottom="38dp"
android:onClick="ReadData"
android:text="Read"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>



-------------------------------------------------------------------------------------


useful video : 

https://youtu.be/f-eSSDYK9cA



UPDATE DATA  & DELETE DATA.



package com.deepesh.firebaselearningapp;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.HashMap;
import java.util.Map;


public class MainActivity extends AppCompatActivity {

EditText age_editText;
EditText name_editText;
TextView textview1;
DatabaseReference databaseReference;

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


age_editText = findViewById(R.id.age_editText);
name_editText = findViewById(R.id.name_editText);
textview1 = findViewById(R.id.textView1);

//Gets reference to the Required Node inside Database.
// if No parameter pass , then points to the Highest-Level parent Node.
databaseReference = FirebaseDatabase.getInstance().getReference("users");

}

//button click function
public void UpdateData(View view) {

String name = name_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());

// Create a hashmap , key should be the location
// path of data you want to update/change
// Path is Case-Sensitive.
// Map Value should be the new VALUE.

// The first "/" points to the Node , you
// Specified inside the getReference()

// If no data is present or no such node present at
// given Path , firebase creates one.

// Then pass the Hashmap inside the
// updateChildren() function.

Map<String,Object> updatedData = new HashMap<>();
updatedData.put("/user2/Name",name);
updatedData.put("/user2/Age",age);

databaseReference.updateChildren(updatedData);

Log.d("TAG", "DATA UPDATED");
}




//button click function
public void DeleteData(View view) {


//USE ANY ONE ONLY !

// 1st WAY TO DELETE DATA
// Setting it null , automatically deletes the Data.
databaseReference.child("user2").child("Name").setValue(null);



// 2nd WAY TO DELETE DATA
// Returns a Task object & we can set result listeners too.
Task<Void> task = databaseReference.child("user2").child("Name").removeValue();

task.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {

Log.d("TAG", "DATA DELETED SUCESSFULLY !");
}
});

task.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {

Log.d("TAG", "DATA DELETION FAIL !");
}
});

}


}



-------------------------------------------------------------------------------------


addChildEventListener( )









package com.deepesh.firebaselearningapp;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.google.firebase.database.ChildEventListener;
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;
import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

private static final String TAG = "TAG";
EditText age_editText;
EditText name_editText;
EditText userid_editText;
TextView textview1;
DatabaseReference databaseReference;

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


age_editText = findViewById(R.id.age_editText);
name_editText = findViewById(R.id.name_editText);
userid_editText = findViewById(R.id.userid_editText);
textview1 = findViewById(R.id.textView1);


databaseReference = FirebaseDatabase.getInstance().getReference("users");

// EVENT LSITENER - GETS INVOKED EVERYTIME THERE IS A CHANGE
// IN ANY CHILD NODES UNDER IT.
databaseReference.addChildEventListener(new ChildEventListener() {

// CALLED WHEN A NEW NODE IS INSERTED UNDER
// PARENT NODE SPECIFIED IN getReference().
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
Log.d(TAG, "onChildAdded: CHILD ADDED ");
Map<String, Object> changedData = (Map<String, Object>) snapshot.getValue();
Log.d(TAG, "NAME : " + changedData.get("Name"));
Log.d(TAG, "AGE : " + changedData.get("Age"));
}

//CALLED WHEN ANY CHILD NODE VALUE IS CHANGED
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
Log.d(TAG, "onChildChanged: CHILD CHANGED ");
// The snapshot Contains the Child node (Hashmap)
Map<String, Object> changedData = (Map<String, Object>) snapshot.getValue();
Log.d(TAG, "NAME : " + changedData.get("Name"));
Log.d(TAG, "AGE : " + changedData.get("Age"));
}

//CALLED WHEN ANY CHILD NODE VALUE IS REMOVED
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
Log.d(TAG, "onChildRemoved: CHILD REMOVED ");
// The snapshot Contains the Child node (Hashmap)
Map<String, Object> changedData = (Map<String, Object>) snapshot.getValue();
Log.d(TAG, "NAME : " + changedData.get("Name"));
Log.d(TAG, "AGE : " + changedData.get("Age"));
}

@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

}

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

}
});


}

//button click function
public void UpdateData(View view) {

String name = name_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());

//RECOMMENDED WAY TO UPDATE/INSERT MULTIPLE DATA
Map<String, Object> data = new HashMap<>();
data.put("Name", name);
data.put("Age", age);

String userid = userid_editText.getText().toString();
databaseReference.child(userid).setValue(data);

Log.d("TAG", "DATA UPDATED");

}


//button click function
public void ReadData(View view) {

String userid = userid_editText.getText().toString();

databaseReference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {

// RETURNS A OBJECT CONTAINING A SINGLE HASHMAP
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
Map<String, Object> data = (Map<String, Object>) snapshot.getValue();

Log.d("TAG", "NAME : " + data.get("Name"));
Log.d("TAG", "AGE : " + data.get("Age"));
}

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

}
});

}

//button click function
public void InsertData(View view) {

String name = name_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());

//RECOMMENDED WAY TO UPDATE/INSERT MULTIPLE DATA
Map<String, Object> data = new HashMap<>();
data.put("Name", name);
data.put("Age", age);

String userid = userid_editText.getText().toString();
databaseReference.child(userid).setValue(data);

Log.d("TAG", "DATA INSERTED");


}

//button click function
public void DeleteData(View view) {

String userid = userid_editText.getText().toString();
databaseReference.child(userid).removeValue();

Log.d("TAG", "DATA REMOVED ");

}


}



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<EditText
android:id="@+id/age_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:ems="10"
android:hint="Enter age..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name_editText" />

<EditText
android:id="@+id/name_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:ems="10"
android:hint="Enter name..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginTop="51dp"
android:text="Ready to code"
android:textSize="30sp"
app:layout_constraintStart_toStartOf="@+id/userid_editText"
app:layout_constraintTop_toBottomOf="@+id/userid_editText" />

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="42dp"
android:layout_marginBottom="39dp"
android:onClick="UpdateData"
android:text="Update"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="54dp"
android:layout_marginBottom="39dp"
android:onClick="ReadData"
android:text="Read"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="30dp"
android:layout_marginTop="104dp"
android:layout_marginBottom="103dp"
android:onClick="InsertData"
android:text="Insert"
app:layout_constraintBottom_toBottomOf="@+id/button3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView1" />

<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="70dp"
android:layout_marginBottom="53dp"
android:onClick="DeleteData"
android:text="Delete"
app:layout_constraintBottom_toTopOf="@+id/button4"
app:layout_constraintEnd_toEndOf="parent" />

<EditText
android:id="@+id/userid_editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="86dp"
android:layout_marginTop="22dp"
android:ems="10"
android:hint="Enter UserId"
android:inputType="textPersonName"
app:layout_constraintStart_toStartOf="@+id/age_editText"
app:layout_constraintTop_toBottomOf="@+id/age_editText" />
</androidx.constraintlayout.widget.ConstraintLayout>



-------------------------------------------------------------------------------------


INSERT JAVA OBJECTS (POJO) IN FIREBASE.








package com.deepesh.firebaselearningapp;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.ChildEventListener;
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 {

EditText age_editText;
EditText name_editText;
TextView textview1;
DatabaseReference databaseReference;

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

age_editText = findViewById(R.id.age_editText);
name_editText = findViewById(R.id.name_editText);
textview1 = findViewById(R.id.textView1);

databaseReference = FirebaseDatabase.getInstance().getReference("users");

databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

// GIVES ERROR.
//Person person1 = (Person)snapshot.getValue();

//WORKS FINE
//Person person1 = snapshot.getValue(Person.class);

Person person1 = snapshot.getValue(Person.class);

textview1.setText("NAME : " + person1.getName() + "\n");
textview1.append("AGE : " + person1.getAge());

}

@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

}

@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {

}

@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

}

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

}
});

}


//button click function
public void ReadData(View view) {

databaseReference.child("user2").addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

}

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

}
});

}

//button click function
public void InsertData(View view) {

String name = name_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());

Person person1 = new Person(name, age);

databaseReference.child("user2").setValue(person1);

Toast.makeText(this, "DATA INSERTED", Toast.LENGTH_SHORT).show();

}

}



package com.deepesh.firebaselearningapp;

// RULES TO FOLLOW :
// 1] The field names should Match the names in the Firebase Nodes.
// 2] Must contain getters & setters - will be used by firebase
// 3] Must Contain a Empty constructor too - will be used by firebase

public class Person {

int Age;
String Name;

Person(String name, int age) {
this.Age = age;
this.Name = name;
}

Person() {

}

public int getAge() {
return Age;
}

public void setAge(int age) {
Age = age;
}

public String getName() {
return Name;
}

public void setName(String name) {
Name = name;
}

}



<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<EditText
android:id="@+id/age_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="25dp"
android:ems="10"
android:hint="Enter age..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/name_editText" />

<EditText
android:id="@+id/name_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="36dp"
android:ems="10"
android:hint="Enter name..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="269dp"
android:text="Ready to code"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="42dp"
android:layout_marginBottom="39dp"
android:onClick="InsertData"
android:text="Insert"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="54dp"
android:layout_marginBottom="39dp"
android:onClick="ReadData"
android:text="Read"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>




-------------------------------------------------------------------------------------


INSERT & DISPLAY DATA ON RECYCLERVIEW.





activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<EditText
android:id="@+id/age_editText"
android:layout_width="0dp"
android:layout_height="44dp"
android:layout_marginTop="63dp"
android:layout_marginBottom="60dp"
android:ems="10"
android:hint="Enter age..."
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="@+id/userid_editText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/name_editText" />

<EditText
android:id="@+id/name_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Enter name..."
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="44dp"
android:layout_marginBottom="17dp"
android:onClick="InsertData"
android:text="Insert"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="56dp"
android:layout_marginBottom="17dp"
android:onClick="ReadData"
android:text="Read"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview1"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="66dp"
android:layout_marginBottom="59dp"
app:layout_constraintBottom_toBottomOf="@+id/button3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/userid_editText" />

<EditText
android:id="@+id/userid_editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="138dp"
android:ems="10"
android:hint="Enter UserId"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>


MainActivity.java

package com.deepesh.firebaselearningapp;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import com.google.firebase.database.ChildEventListener;
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;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {

EditText age_editText;
EditText name_editText;
EditText userId_editText;
RecyclerView recyclerview1;
MyAdapter myAdapter;
DatabaseReference databaseReference;
List<User> users_list;

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

age_editText = findViewById(R.id.age_editText);
name_editText = findViewById(R.id.name_editText);
userId_editText = findViewById(R.id.userid_editText);

users_list = new ArrayList<>();
myAdapter= new MyAdapter(this,users_list);
recyclerview1=findViewById(R.id.recyclerview1);
recyclerview1.setLayoutManager(new LinearLayoutManager(this));
recyclerview1.setAdapter(myAdapter);


databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

User myuser = snapshot.getValue(User.class);
users_list.add(myuser);

// Notifies the System about Data change inside the Recyclerview adapter
myAdapter.notifyDataSetChanged();

}

@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

}

@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {

}

@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {

}

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

}
});

}


//button click function
public void ReadData(View view) {

databaseReference.child("users").addListenerForSingleValueEvent(new ValueEventListener() {

@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

}

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

}
});

}

//button click function
public void InsertData(View view) {

String name = name_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());
String userID = userId_editText.getText().toString();

User myuser = new User(name,age);
databaseReference.child(userID).setValue(myuser);

}

}


User.java

package com.deepesh.firebaselearningapp;

// RULES TO FOLLOW :
// 1] The field names should Match the names in the Firebase Nodes.
// 2] Must contain getters & setters - will be used by firebase
// 3] Must Contain a Empty constructor too - will be used by firebase

public class User {

int Age;
String Name;

User(String name, int age) {
this.Age = age;
this.Name = name;
}

User() {

}

public int getAge() {
return Age;
}

public void setAge(int age) {
Age = age;
}

public String getName() {
return Name;
}

public void setName(String name) {
Name = name;
}

}


MyAdapter.java

package com.deepesh.firebaselearningapp;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

List<User> users_list;

MyAdapter(Context context, List<User> userlist){
this.users_list=userlist;
}


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row,parent,false);

return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

User user = users_list.get(position);

holder.textview1.setText(user.getName() + " | "+user.getAge());
}

@Override
public int getItemCount() {
return users_list.size();
}

static class MyViewHolder extends RecyclerView.ViewHolder {

TextView textview1;

public MyViewHolder(@NonNull View itemView) {
super(itemView);
textview1 = itemView.findViewById(R.id.textview_single_row);
}
}

}




single_row.xml 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:id="@+id/textview_single_row"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingStart="15dp"
android:paddingEnd="5dp"
android:paddingBottom="5dp"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Hello" />

</androidx.constraintlayout.widget.ConstraintLayout>



------------------------------------------------------------------------------------------------------------


SORTING & FILTERING 








PERFORM SQL LIKE QUERIES  : 









<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">


<EditText
android:id="@+id/age_editText"
android:layout_width="0dp"
android:layout_height="44dp"
android:layout_marginTop="61dp"
android:layout_marginBottom="53dp"
android:ems="10"
android:hint="Enter age..."
android:inputType="textPersonName"
app:layout_constraintBottom_toBottomOf="@+id/profession_editText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/name_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Enter name..."
android:inputType="textPersonName"
app:layout_constraintBottom_toTopOf="@+id/age_editText"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13dp"
android:layout_marginBottom="17dp"
android:onClick="InsertData"
android:text="Insert"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="30dp"
android:layout_marginBottom="17dp"
android:onClick="ReadData"
android:text="Read"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="17dp"
android:onClick="ShowData"
android:text="Show"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview1"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="11dp"
app:layout_constraintBottom_toTopOf="@+id/button3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/userid_editText" />

<EditText
android:id="@+id/userid_editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Enter UserId"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/city_editText" />

<EditText
android:id="@+id/profession_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="113dp"
android:ems="10"
android:hint="Enter Profession"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/city_editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="44dp"
android:ems="10"
android:hint="Enter city"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/profession_editText" />


</androidx.constraintlayout.widget.ConstraintLayout>



package com.deepesh.firebaselearningapp;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

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.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity{

private static final String TAG = "TAG";
TextView name_editText,age_editText,profession_editText,city_editText,userId_editText;
DatabaseReference databaseReference;
List<User> users_list;

RecyclerView recyclerView1;
MyAdapter myAdapter;

ValueEventListener valueEvent_listener;

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

// initialises all fields
init();

databaseReference = FirebaseDatabase.getInstance().getReference("users");

}



private void init(){

name_editText = findViewById(R.id.name_editText);
age_editText=findViewById(R.id.age_editText);
profession_editText=findViewById(R.id.profession_editText);
city_editText=findViewById(R.id.city_editText);
userId_editText = findViewById(R.id.userid_editText);
users_list= new ArrayList<>();

recyclerView1=findViewById(R.id.recyclerview1);
myAdapter= new MyAdapter(this,users_list);
recyclerView1.setLayoutManager(new LinearLayoutManager(this));
recyclerView1.setAdapter(myAdapter);

valueEvent_listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

for (DataSnapshot dataSnapshot : snapshot.getChildren()){

User myuser = dataSnapshot.getValue(User.class);
users_list.add(myuser);
}
// Notifies adapter of change in dataset
myAdapter.notifyDataSetChanged();
Log.d(TAG, "onDataChange: DATA SHOWED !");

}

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

}
};


}


// user clicks button
public void InsertData(View view) {

String name = name_editText.getText().toString();
String profession = profession_editText.getText().toString();
String city = city_editText.getText().toString();
int age = Integer.parseInt(age_editText.getText().toString());
String uid = userId_editText.getText().toString();

User new_user = new User(uid,name,age,profession,city);

databaseReference.child(uid).setValue(new_user);

Toast.makeText(this, "DATA INSERTED !", Toast.LENGTH_SHORT).show();

}


// user clicks button
public void ReadData(View view) {

String uid = userId_editText.getText().toString();

databaseReference.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {

User user1 = snapshot.getValue(User.class);
Log.d(TAG, "NAME : " + user1.getName());
Log.d(TAG, "AGE : " + user1.getAge());
Log.d(TAG, "CITY: " + user1.getCity());

}

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

}
});
}


// user clicks button
public void ShowData(View view) {

// EXAMPLE QUERIES

// select * from TABLENAME.
databaseReference.addValueEventListener(valueEvent_listener);
//
//
// // select * from TABLENAME where name ="Ali"
// Query query1 = databaseReference.orderByChild("name").equalTo("Ali");
// query1.addValueEventListener(valueEvent_listener);
//
//
// // select * from TABLENAME order by name;
// Query query2 = databaseReference.orderByChild("name");
// query2.addValueEventListener(valueEvent_listener);
//
//
// select * from TABLENAME where age > 30;
// Query query3 = databaseReference.orderByChild("age").startAt(30);
// query3.addValueEventListener(valueEvent_listener);
//
//
// // select * from TABLENAME where age < 30;
// Query query4 = databaseReference.orderByChild("age").endAt(30);
// query3.addValueEventListener(valueEvent_listener);
//
//
// // select * from TABLENAME limit 3;
// databaseReference.limitToFirst(3).addValueEventListener(valueEvent_listener);

}

}




package com.deepesh.firebaselearningapp;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

List<User> users_list;

MyAdapter(Context context, List<User> userlist){
this.users_list=userlist;
}


@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_row,parent,false);

return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

User myuser = users_list.get(position);

holder.name_textview.setText(myuser.getName());
holder.profession_textview.setText(myuser.getProfession());
holder.city_textview.setText(myuser.getCity());
holder.age_textview.setText(String.valueOf(myuser.getAge()));
}

@Override
public int getItemCount() {
return users_list.size();
}

static class MyViewHolder extends RecyclerView.ViewHolder {

TextView name_textview;
TextView age_textview;
TextView city_textview;
TextView profession_textview;


public MyViewHolder(@NonNull View itemView) {
super(itemView);

name_textview=itemView.findViewById(R.id.nameTextview_single_row);
age_textview=itemView.findViewById(R.id.age_textview_singleRow);
city_textview=itemView.findViewById(R.id.city_textview_singleRow);
profession_textview=itemView.findViewById(R.id.profession_textview_singleRow);

}
}

}



package com.deepesh.firebaselearningapp;

// RULES TO FOLLOW :
// 1] The field names should Match the names in the Firebase Nodes.
// 2] Must contain getters & setters - will be used by firebase
// 3] Must Contain a Empty constructor too - will be used by firebase

public class User {

int age;
String name;
String uid;
String city;
String profession;


User(String userid ,String name, int age,String profession,String city) {
this.age = age;
this.name = name;
this.profession=profession;
this.city=city;
this.uid=userid;
}

User() {

}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getUid() {
return uid;
}

public void setUid(String uid) {
this.uid = uid;
}

public String getCity() {
return city;
}

public void setCity(String city) {
this.city = city;
}

public String getProfession() {
return profession;
}

public void setProfession(String profession) {
this.profession = profession;
}

}





<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="15dp">

<TextView
android:id="@+id/nameTextview_single_row"
android:layout_width="411dp"
android:layout_height="wrap_content"
android:layout_marginStart="46dp"
android:layout_marginTop="20dp"
android:paddingStart="15dp"
android:paddingEnd="5dp"
android:paddingBottom="5dp"
android:textSize="28sp"
app:layout_constraintBottom_toTopOf="@+id/age_textview_singleRow"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Ready to Code" />

<TextView
android:id="@+id/age_textview_singleRow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="2dp"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/profession_textview_singleRow"
app:layout_constraintStart_toStartOf="@+id/profession_textview_singleRow"
app:layout_constraintTop_toBottomOf="@+id/nameTextview_single_row"
tools:text="Age" />

<TextView
android:id="@+id/profession_textview_singleRow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="6dp"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/city_textview_singleRow"
app:layout_constraintStart_toStartOf="@+id/city_textview_singleRow"
app:layout_constraintTop_toBottomOf="@+id/age_textview_singleRow"
tools:text="Profession" />

<TextView
android:id="@+id/city_textview_singleRow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="91dp"
android:layout_marginBottom="6dp"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/profession_textview_singleRow"
tools:text="Country" />


</androidx.constraintlayout.widget.ConstraintLayout>


</androidx.cardview.widget.CardView>



------------------------------------------------------------------------------------------------------------
















































Comments

Popular posts from this blog

React Js + React-Redux (part-2)

React Js + CSS Styling + React Router (part-1)

ViteJS (Module Bundlers, Build Tools)