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
Post a Comment