¿Cómo realizar operaciones CRUD en la base de datos de habitaciones en Android?

Los datos de la aplicación se pueden guardar en los dispositivos de los usuarios de diferentes maneras. Podemos almacenar datos en el dispositivo del usuario en tablas SQLite, preferencias compartidas y muchas formas más. En este artículo, veremos cómo guardar datos, leer, actualizar y eliminar datos en Room Database en Android. Realizaremos operaciones CRUD usando Room Database en Android. En este artículo, veremos cómo realizar operaciones CRUD en Room Database en Android. 

¿Qué vamos a construir en este artículo? 

Construiremos una aplicación simple en la que agregaremos los diferentes tipos de cursos que están disponibles en Geeks for Geeks. Almacenaremos todos estos datos en Room Database y realizaremos operaciones CRUD en estos cursos. qué

¿Qué es la habitación? 

Room es una biblioteca de persistencia que proporciona una capa de abstracción sobre la base de datos SQLite para permitir una base de datos más robusta. Con la ayuda de Room, podemos crear fácilmente la base de datos y realizar operaciones CRUD con mucha facilidad. 

Componentes de la habitación

Los tres componentes principales de la sala son Entidad, Base de datos y DAO

  • Entidad : la entidad es una clase modal que se anota con @Entity. Esta clase tiene variables que serán nuestras columnas y la clase es nuestra tabla.
  • Base de datos : es una clase abstracta donde almacenaremos todas las entradas de nuestra base de datos a las que podemos llamar Entidades.
  • DAO : la forma completa de DAO es un objeto de acceso a la base de datos que es una clase de interfaz con la ayuda de la cual podemos realizar diferentes operaciones en nuestra base de datos.

Ahora, avancemos hacia la implementación de Room Database en Android. 

Implementación paso a paso

Paso 1: Crear un nuevo proyecto

Para crear un nuevo proyecto en Android Studio, consulte Cómo crear/iniciar un nuevo proyecto en Android Studio . Tenga en cuenta que seleccione Java como lenguaje de programación.

Paso 2: Agregar dependencia para usar Room en archivos build.gradle

Vaya a la aplicación > Gradle Scripts > archivo build.gradle y agregue las siguientes dependencias en la sección de dependencias. 

// agregue la dependencia a continuación para usar la habitación.  

implementación ‘androidx.room:room-runtime:2.2.5’

anotaciónProcesador ‘androidx.room:room-compiler:2.2.5’

// agregue la dependencia a continuación para usar extensiones de ciclo de vida para room.  

implementación ‘androidx.lifecycle:lifecycle-extensions:2.2.0’

annotationProcessor ‘androidx.lifecycle:lifecycle-compiler:2.2.0’

Después de agregar la sección de dependencias anterior. Ahora sincroniza tu proyecto y avanzaremos hacia nuestro archivo XML. 

Paso 3: trabajar con el archivo activity_main.xml 

aplicación > res > diseño > actividad_principal.xml actividad_principal.xml

XML

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    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"
    android:orientation="vertical"
    tools:context=".MainActivity">
  
    <!--recycler view to display our data-->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/idRVCourses"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
  
    <!--fab to add new courses-->
    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/idFABAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginStart="18dp"
        android:layout_marginTop="18dp"
        android:layout_marginEnd="18dp"
        android:layout_marginBottom="18dp"
        android:src="@android:drawable/ic_input_add"
        app:tint="@color/white" />
      
</RelativeLayout>

Paso 4: Crear una clase modal para almacenar nuestros datos

Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y nombre la clase como CourseModal y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle. 

Java

import androidx.room.Entity;
import androidx.room.PrimaryKey;
  
// below line is for setting table name.
@Entity(tableName = "course_table")
public class CourseModal {
  
    // below line is to auto increment
    // id for each course.
    @PrimaryKey(autoGenerate = true)
      
    // variable for our id.
    private int id;
      
    // below line is a variable 
    // for course name.
    private String courseName;
     
    // below line is use for 
    // course description.
    private String courseDescription;
      
    // below line is use 
    // for course duration.
    private String courseDuration;
  
    // below line we are creating constructor class.
    // inside constructor class we are not passing 
    // our id because it is incrementing automatically
    public CourseModal(String courseName, String courseDescription, String courseDuration) {
        this.courseName = courseName;
        this.courseDescription = courseDescription;
        this.courseDuration = courseDuration;
    }
  
    // on below line we are creating
    // getter and setter methods.
    public String getCourseName() {
        return courseName;
    }
  
    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }
  
    public String getCourseDescription() {
        return courseDescription;
    }
  
    public void setCourseDescription(String courseDescription) {
        this.courseDescription = courseDescription;
    }
  
    public String getCourseDuration() {
        return courseDuration;
    }
  
    public void setCourseDuration(String courseDuration) {
        this.courseDuration = courseDuration;
    }
  
    public int getId() {
        return id;
    }
  
    public void setId(int id) {
        this.id = id;
    }
}

Paso 5: Crear una interfaz Dao para nuestra base de datos

Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > Clase Java y nómbrelo como Dao y seleccione Interfaz. Después de crear una clase de interfaz y agregarle el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import androidx.lifecycle.LiveData;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
  
import java.util.List;
  
// Adding annotation 
// to our Dao class
@androidx.room.Dao
public interface Dao {
  
    // below method is use to 
    // add data to database.
    @Insert
    void insert(CourseModal model);
  
    // below method is use to update 
    // the data in our database.
    @Update
    void update(CourseModal model);
  
    // below line is use to delete a 
    // specific course in our database.
    @Delete
    void delete(CourseModal model);
  
    // on below line we are making query to
    // delete all courses from our database.
    @Query("DELETE FROM course_table")
    void deleteAllCourses();
  
    // below line is to read all the courses from our database.
    // in this we are ordering our courses in ascending order 
    // with our course name.
    @Query("SELECT * FROM course_table ORDER BY courseName ASC")
    LiveData<List<CourseModal>> getAllCourses();
}

Paso 6: Crear una clase de base de datos

Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre CourseDatabase y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.content.Context;
import android.os.AsyncTask;
  
import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;
  
// adding annotation for our database entities and db version.
@Database(entities = {CourseModal.class}, version = 1)
public abstract class CourseDatabase extends RoomDatabase {
  
    // below line is to create instance
    // for our database class.
    private static CourseDatabase instance;
  
    // below line is to create
    // abstract variable for dao.
    public abstract Dao Dao();
  
    // on below line we are getting instance for our database.
    public static synchronized CourseDatabase getInstance(Context context) {
        // below line is to check if 
        // the instance is null or not.
        if (instance == null) {
            // if the instance is null we
            // are creating a new instance
            instance =
                    // for creating a instance for our database 
                    // we are creating a database builder and passing 
                    // our database class with our database name.
                    Room.databaseBuilder(context.getApplicationContext(),
                            CourseDatabase.class, "course_database")
                            // below line is use to add fall back to 
                            // destructive migration to our database.
                            .fallbackToDestructiveMigration()
                            // below line is to add callback 
                            // to our database.
                            .addCallback(roomCallback)
                            // below line is to 
                            // build our database.
                            .build();
        }
        // after creating an instance 
        // we are returning our instance
        return instance;
    }
  
    // below line is to create a callback for our room database.
    private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            // this method is called when database is created
            // and below line is to populate our data.
            new PopulateDbAsyncTask(instance).execute();
        }
    };
  
    // we are creating an async task class to perform task in background.
    private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {
        PopulateDbAsyncTask(CourseDatabase instance) {
            Dao dao = instance.Dao();
        }
        @Override
        protected Void doInBackground(Void... voids) {
            return null;
        }
    }
}

Paso 7: Crea una nueva clase java para nuestro Repositorio

Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre CourseRepository y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.app.Application;
import android.os.AsyncTask;
  
import androidx.lifecycle.LiveData;
  
import java.util.List;
  
public class CourseRepository {
      
    // below line is the create a variable 
    // for dao and list for all courses.
    private Dao dao;
    private LiveData<List<CourseModal>> allCourses;
  
    // creating a constructor for our variables
    // and passing the variables to it.
    public CourseRepository(Application application) {
        CourseDatabase database = CourseDatabase.getInstance(application);
        dao = database.Dao();
        allCourses = dao.getAllCourses();
    }
  
    // creating a method to insert the data to our database.
    public void insert(CourseModal model) {
        new InsertCourseAsyncTask(dao).execute(model);
    }
  
    // creating a method to update data in database.
    public void update(CourseModal model) {
        new UpdateCourseAsyncTask(dao).execute(model);
    }
  
    // creating a method to delete the data in our database.
    public void delete(CourseModal model) {
        new DeleteCourseAsyncTask(dao).execute(model);
    }
  
    // below is the method to delete all the courses.
    public void deleteAllCourses() {
        new DeleteAllCoursesAsyncTask(dao).execute();
    }
  
    // below method is to read all the courses.
    public LiveData<List<CourseModal>> getAllCourses() {
        return allCourses;
    }
  
    // we are creating a async task method to insert new course.
    private static class InsertCourseAsyncTask extends AsyncTask<CourseModal, Void, Void> {
        private Dao dao;
  
        private InsertCourseAsyncTask(Dao dao) {
            this.dao = dao;
        }
  
        @Override
        protected Void doInBackground(CourseModal... model) {
            // below line is use to insert our modal in dao.
            dao.insert(model[0]);
            return null;
        }
    }
  
    // we are creating a async task method to update our course.
    private static class UpdateCourseAsyncTask extends AsyncTask<CourseModal, Void, Void> {
        private Dao dao;
  
        private UpdateCourseAsyncTask(Dao dao) {
            this.dao = dao;
        }
  
        @Override
        protected Void doInBackground(CourseModal... models) {
            // below line is use to update
            // our modal in dao.
            dao.update(models[0]);
            return null;
        }
    }
  
    // we are creating a async task method to delete course.
    private static class DeleteCourseAsyncTask extends AsyncTask<CourseModal, Void, Void> {
        private Dao dao;
  
        private DeleteCourseAsyncTask(Dao dao) {
            this.dao = dao;
        }
  
        @Override
        protected Void doInBackground(CourseModal... models) {
            // below line is use to delete 
            // our course modal in dao.
            dao.delete(models[0]);
            return null;
        }
    }
  
    // we are creating a async task method to delete all courses.
    private static class DeleteAllCoursesAsyncTask extends AsyncTask<Void, Void, Void> {
        private Dao dao;
        private DeleteAllCoursesAsyncTask(Dao dao) {
            this.dao = dao;
        }
        @Override
        protected Void doInBackground(Void... voids) {
            // on below line calling method
            // to delete all courses.
            dao.deleteAllCourses();
            return null;
        }
    }
}

Paso 8: Creando una clase para nuestro Repositorio

Vaya a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > Clase Java y nombre la clase como ViewModal y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.app.Application;
  
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
  
import java.util.List;
  
public class ViewModal extends AndroidViewModel {
      
    // creating a new variable for course repository.
    private CourseRepository repository;
     
    // below line is to create a variable for live 
    // data where all the courses are present.
    private LiveData<List<CourseModal>> allCourses;
  
    // constructor for our view modal.
    public ViewModal(@NonNull Application application) {
        super(application);
        repository = new CourseRepository(application);
        allCourses = repository.getAllCourses();
    }
      
    // below method is use to insert the data to our repository.
    public void insert(CourseModal model) {
        repository.insert(model);
    }
  
    // below line is to update data in our repository.
    public void update(CourseModal model) {
        repository.update(model);
    }
  
    // below line is to delete the data in our repository.
    public void delete(CourseModal model) {
        repository.delete(model);
    }
  
    // below method is to delete all the courses in our list.
    public void deleteAllCourses() {
        repository.deleteAllCourses();
    }
  
    // below method is to get all the courses in our list.
    public LiveData<List<CourseModal>> getAllCourses() {
        return allCourses;
    }
}

Paso 9: crear un archivo de diseño para cada elemento de RecyclerView

Vaya a la aplicación > res > diseño > haga clic con el botón derecho en él > Nuevo > archivo de recursos de diseño y asígnele el nombre curso_rv_elemento y agréguele el código siguiente. Se agregan comentarios en el código para conocer con más detalle. 

XML

<?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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:elevation="8dp"
    app:cardCornerRadius="8dp">
  
    <LinearLayout
        android:id="@+id/idLLCourse"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:orientation="vertical">
  
        <!--text view for our course name-->
        <TextView
            android:id="@+id/idTVCourseName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="Course Name"
            android:textColor="@color/black"
            android:textSize="15sp" />
  
        <!--text view for our course duration-->
        <TextView
            android:id="@+id/idTVCourseDuration"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="Course Duration"
            android:textColor="@color/black"
            android:textSize="15sp" />
  
        <!--text view for our course description-->
        <TextView
            android:id="@+id/idTVCourseDescription"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:text="Course Description"
            android:textColor="@color/black"
            android:textSize="15sp" />
    </LinearLayout>
      
</androidx.cardview.widget.CardView>

Paso 10: crear una clase de adaptador RecyclerView para establecer datos para cada elemento de RecyclerView

Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > clase Java y asígnele el nombre CourseRVAdapter y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
  
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
  
public class CourseRVAdapter extends ListAdapter<CourseModal, CourseRVAdapter.ViewHolder> {
      
    // creating a variable for on item click listener.
    private OnItemClickListener listener;
  
    // creating a constructor class for our adapter class.
    CourseRVAdapter() {
        super(DIFF_CALLBACK);
    }
  
    // creating a call back for item of recycler view.
    private static final DiffUtil.ItemCallback<CourseModal> DIFF_CALLBACK = new DiffUtil.ItemCallback<CourseModal>() {
        @Override
        public boolean areItemsTheSame(CourseModal oldItem, CourseModal newItem) {
            return oldItem.getId() == newItem.getId();
        }
  
        @Override
        public boolean areContentsTheSame(CourseModal oldItem, CourseModal newItem) {
            // below line is to check the course name, description and course duration.
            return oldItem.getCourseName().equals(newItem.getCourseName()) &&
                    oldItem.getCourseDescription().equals(newItem.getCourseDescription()) &&
                    oldItem.getCourseDuration().equals(newItem.getCourseDuration());
        }
    };
  
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // below line is use to inflate our layout
        // file for each item of our recycler view.
        View item = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.course_rv_item, parent, false);
        return new ViewHolder(item);
    }
  
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        // below line of code is use to set data to
        // each item of our recycler view.
        CourseModal model = getCourseAt(position);
        holder.courseNameTV.setText(model.getCourseName());
        holder.courseDescTV.setText(model.getCourseDescription());
        holder.courseDurationTV.setText(model.getCourseDuration());
    }
  
    // creating a method to get course modal for a specific position.
    public CourseModal getCourseAt(int position) {
        return getItem(position);
    }
  
    public class ViewHolder extends RecyclerView.ViewHolder {
        // view holder class to create a variable for each view.
        TextView courseNameTV, courseDescTV, courseDurationTV;
  
        ViewHolder(@NonNull View itemView) {
            super(itemView);
            // initializing each view of our recycler view.
            courseNameTV = itemView.findViewById(R.id.idTVCourseName);
            courseDescTV = itemView.findViewById(R.id.idTVCourseDescription);
            courseDurationTV = itemView.findViewById(R.id.idTVCourseDuration);
              
            // adding on click listener for each item of recycler view.
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // inside on click listener we are passing 
                    // position to our item of recycler view.
                    int position = getAdapterPosition();
                    if (listener != null && position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(getItem(position));
                    }
                }
            });
        }
    }
  
    public interface OnItemClickListener {
        void onItemClick(CourseModal model);
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
}

Paso 11: Crear una nueva actividad para agregar y actualizar nuestro curso

Navegue a la aplicación > java > el nombre del paquete de su aplicación > haga clic con el botón derecho en él > Nuevo > Actividad vacía y asígnele el nombre NewCourseActivity y vaya a la parte XML y agréguele el código a continuación. A continuación se muestra el código para el archivo activity_new_course.xml .

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".NewCourseActivity">
      
    <!--edit text for our course name-->
    <EditText
        android:id="@+id/idEdtCourseName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:hint="Enter Course Name" />
  
    <!--edit text for our course description-->
    <EditText
        android:id="@+id/idEdtCourseDescription"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:hint="Enter Course Description" />
  
    <!--edit text for course description-->
    <EditText
        android:id="@+id/idEdtCourseDuration"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:hint="Course Duration" />
  
    <!--button for saving data to room database-->
    <Button
        android:id="@+id/idBtnSaveCourse"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:padding="5dp"
        android:text="Save your course"
        android:textAllCaps="false" />
      
</LinearLayout>

Paso 12: trabajar con el archivo NewCourseActivity.java

Vaya a la aplicación > java > el nombre del paquete de su aplicación > archivo NewCourseActivity.java y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
  
import androidx.appcompat.app.AppCompatActivity;
  
public class NewCourseActivity extends AppCompatActivity {
  
    // creating a variables for our button and edittext.
    private EditText courseNameEdt, courseDescEdt, courseDurationEdt;
    private Button courseBtn;
  
    // creating a constant string variable for our 
    // course name, description and duration.
    public static final String EXTRA_ID = "com.gtappdevelopers.gfgroomdatabase.EXTRA_ID";
    public static final String EXTRA_COURSE_NAME = "com.gtappdevelopers.gfgroomdatabase.EXTRA_COURSE_NAME";
    public static final String EXTRA_DESCRIPTION = "com.gtappdevelopers.gfgroomdatabase.EXTRA_COURSE_DESCRIPTION";
    public static final String EXTRA_DURATION = "com.gtappdevelopers.gfgroomdatabase.EXTRA_COURSE_DURATION";
      
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_course);
          
        // initializing our variables for each view.
        courseNameEdt = findViewById(R.id.idEdtCourseName);
        courseDescEdt = findViewById(R.id.idEdtCourseDescription);
        courseDurationEdt = findViewById(R.id.idEdtCourseDuration);
        courseBtn = findViewById(R.id.idBtnSaveCourse);
          
        // below line is to get intent as we
        // are getting data via an intent.
        Intent intent = getIntent();
        if (intent.hasExtra(EXTRA_ID)) {
            // if we get id for our data then we are
            // setting values to our edit text fields.
            courseNameEdt.setText(intent.getStringExtra(EXTRA_COURSE_NAME));
            courseDescEdt.setText(intent.getStringExtra(EXTRA_DESCRIPTION));
            courseDurationEdt.setText(intent.getStringExtra(EXTRA_DURATION));
        }
        // adding on click listener for our save button.
        courseBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // getting text value from edittext and validating if
                // the text fields are empty or not.
                String courseName = courseNameEdt.getText().toString();
                String courseDesc = courseDescEdt.getText().toString();
                String courseDuration = courseDurationEdt.getText().toString();
                if (courseName.isEmpty() || courseDesc.isEmpty() || courseDuration.isEmpty()) {
                    Toast.makeText(NewCourseActivity.this, "Please enter the valid course details.", Toast.LENGTH_SHORT).show();
                    return;
                }
                // calling a method to save our course.
                saveCourse(courseName, courseDesc, courseDuration);
            }
        });
    }
  
    private void saveCourse(String courseName, String courseDescription, String courseDuration) {
        // inside this method we are passing 
        // all the data via an intent.
        Intent data = new Intent();
          
        // in below line we are passing all our course detail.
        data.putExtra(EXTRA_COURSE_NAME, courseName);
        data.putExtra(EXTRA_DESCRIPTION, courseDescription);
        data.putExtra(EXTRA_DURATION, courseDuration);
        int id = getIntent().getIntExtra(EXTRA_ID, -1);
        if (id != -1) {
            // in below line we are passing our id.
            data.putExtra(EXTRA_ID, id);
        }
          
        // at last we are setting result as data.
        setResult(RESULT_OK, data);
          
        // displaying a toast message after adding the data
        Toast.makeText(this, "Course has been saved to Room Database. ", Toast.LENGTH_SHORT).show();
    }
}

Paso 13: trabajar con el archivo MainActivity.java

Vaya a la aplicación > java > el nombre del paquete de su aplicación > archivo MainActivity.java y agréguele el siguiente código. Se agregan comentarios dentro del código para comprender el código con más detalle.

Java

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
  
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
  
import com.google.android.material.floatingactionbutton.FloatingActionButton;
  
import java.util.List;
  
public class MainActivity extends AppCompatActivity {
  
    // creating a variables for our recycler view.
    private RecyclerView coursesRV;
    private static final int ADD_COURSE_REQUEST = 1;
    private static final int EDIT_COURSE_REQUEST = 2;
    private ViewModal viewmodal;
  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        // initializing our variable for our recycler view and fab.
        coursesRV = findViewById(R.id.idRVCourses);
        FloatingActionButton fab = findViewById(R.id.idFABAdd);
  
        // adding on click listener for floating action button.
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // starting a new activity for adding a new course 
                // and passing a constant value in it.
                Intent intent = new Intent(MainActivity.this, NewCourseActivity.class);
                startActivityForResult(intent, ADD_COURSE_REQUEST);
            }
        });
  
        // setting layout manager to our adapter class.
        coursesRV.setLayoutManager(new LinearLayoutManager(this));
        coursesRV.setHasFixedSize(true);
         
        // initializing adapter for recycler view.
        final CourseRVAdapter adapter = new CourseRVAdapter();
          
        // setting adapter class for recycler view.
        coursesRV.setAdapter(adapter);
          
        // passing a data from view modal.
        viewmodal = ViewModelProviders.of(this).get(ViewModal.class);
         
        // below line is use to get all the courses from view modal.
        viewmodal.getAllCourses().observe(this, new Observer<List<CourseModal>>() {
            @Override
            public void onChanged(List<CourseModal> models) {
                // when the data is changed in our models we are
                // adding that list to our adapter class.
                adapter.submitList(models);
            }
        });
        // below method is use to add swipe to delete method for item of recycler view.
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }
  
            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                // on recycler view item swiped then we are deleting the item of our recycler view.
                viewmodal.delete(adapter.getCourseAt(viewHolder.getAdapterPosition()));
                Toast.makeText(MainActivity.this, "Course deleted", Toast.LENGTH_SHORT).show();
            }
        }).
                // below line is use to attach this to recycler view.
                        attachToRecyclerView(coursesRV);
        // below line is use to set item click listener for our item of recycler view.
        adapter.setOnItemClickListener(new CourseRVAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(CourseModal model) {
                // after clicking on item of recycler view
                // we are opening a new activity and passing 
                // a data to our activity.
                Intent intent = new Intent(MainActivity.this, NewCourseActivity.class);
                intent.putExtra(NewCourseActivity.EXTRA_ID, model.getId());
                intent.putExtra(NewCourseActivity.EXTRA_COURSE_NAME, model.getCourseName());
                intent.putExtra(NewCourseActivity.EXTRA_DESCRIPTION, model.getCourseDescription());
                intent.putExtra(NewCourseActivity.EXTRA_DURATION, model.getCourseDuration());
                  
                // below line is to start a new activity and 
                // adding a edit course constant.
                startActivityForResult(intent, EDIT_COURSE_REQUEST);
            }
        });
    }
  
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ADD_COURSE_REQUEST && resultCode == RESULT_OK) {
            String courseName = data.getStringExtra(NewCourseActivity.EXTRA_COURSE_NAME);
            String courseDescription = data.getStringExtra(NewCourseActivity.EXTRA_DESCRIPTION);
            String courseDuration = data.getStringExtra(NewCourseActivity.EXTRA_DURATION);
            CourseModal model = new CourseModal(courseName, courseDescription, courseDuration);
            viewmodal.insert(model);
            Toast.makeText(this, "Course saved", Toast.LENGTH_SHORT).show();
        } else if (requestCode == EDIT_COURSE_REQUEST && resultCode == RESULT_OK) {
            int id = data.getIntExtra(NewCourseActivity.EXTRA_ID, -1);
            if (id == -1) {
                Toast.makeText(this, "Course can't be updated", Toast.LENGTH_SHORT).show();
                return;
            }
            String courseName = data.getStringExtra(NewCourseActivity.EXTRA_COURSE_NAME);
            String courseDesc = data.getStringExtra(NewCourseActivity.EXTRA_DESCRIPTION);
            String courseDuration = data.getStringExtra(NewCourseActivity.EXTRA_DURATION);
            CourseModal model = new CourseModal(courseName, courseDesc, courseDuration);
            model.setId(id);
            viewmodal.update(model);
            Toast.makeText(this, "Course updated", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Course not saved", Toast.LENGTH_SHORT).show();
        }
    }
}

Ahora ejecute su aplicación y vea el resultado de la aplicación. 

Producción:

Consulte el proyecto en el siguiente enlace: https://github.com/ChaitanyaMunje/GFG-Room-Database

Publicación traducida automáticamente

Artículo escrito por chaitanyamunje y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *