O SDK do Android fornece uma biblioteca que facilita o uso do banco de dados. Conforme consta na documentação oficial, a biblioteca ROOM adiciona uma camada de abstração retirando as implementações mais complexas do banco SQLite. Para mais detalhes, acesse a página: GOOGLE DEVELOPERS. Salvar dados em um banco de dados local usando Room. Disponível em: https://developer.android.com/training/data-storage/room?hl=pt-br. Acessado em 20 ago. 2025.
Para usar a lib ROOM no seu projeto, primeiramente é necessário importar a biblioteca. Dessa forma, deve-se ir no arquivo Gradle a nível de app e adicionar as duas linhas no bloco de dependências:
implementation ("androidx.room:room-runtime:2.4.0")
annotationProcessor ("androidx.room:room-compiler:2.4.0")
ou
implementation("androidx.room:room-runtime:2.7.0-rc03")
annotationProcessor("androidx.room:room-compiler:2.7.0-rc03")
Exemplos práticos:
Versão 1:
-
activity_main.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:padding="10dp" android:orientation="vertical" tools:context=".MainActivity"> <EditText android:id="@+id/editTextNome" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:hint="Digite seu nome" /> <EditText android:id="@+id/editTextTelefone" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Digite seu telefone" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="20dp"> <Button android:id="@+id/buttonS" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="5dp" android:layout_weight="1" android:onClick="clicar" android:text="Salvar" /> <Button android:id="@+id/buttonL" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="5dp" android:layout_weight="1" android:onClick="clicar" android:text="Listar" /> <Button android:id="@+id/buttonD" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="clicar" android:text="Excluir" /> </LinearLayout> </LinearLayout>
-
activity_segunda.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=".SegundaActivity"> <ListView android:id="@+id/lista" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
-
Pessoa.java
import android.os.Parcel; import android.os.Parcelable; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity public class Pessoa implements Parcelable { @PrimaryKey(autoGenerate = true) private int id; @ColumnInfo(name = "nome") private String nome; @ColumnInfo(name = "telefone") private String telefone; public Pessoa(int id, String nome, String telefone) { this.id = id; this.nome = nome; this.telefone = telefone; } public Pessoa() {} protected Pessoa(Parcel in) { id = in.readInt(); nome = in.readString(); telefone = in.readString(); } public static final Creator<Pessoa> CREATOR = new Creator<Pessoa>() { @Override public Pessoa createFromParcel(Parcel in) { return new Pessoa(in); } @Override public Pessoa[] newArray(int size) { return new Pessoa[size]; } }; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } @Override public String toString() { return nome + " - " + telefone; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(id); parcel.writeString(nome); parcel.writeString(telefone); } }
-
Banco.java
import androidx.room.Database; import androidx.room.RoomDatabase; @Database(entities = {Pessoa.class}, version = 1) public abstract class Banco extends RoomDatabase { public abstract PessoaDao pessoaDao(); }
-
PessoaDao.java
import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; import androidx.room.Update; import java.util.List; @Dao public interface PessoaDao { @Insert long adicionar(Pessoa p); @Query("SELECT * FROM pessoa") List<Pessoa> listar(); @Update int atualizar(Pessoa p); @Delete int excluir(Pessoa p); }
-
MainActivity.java
import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private EditText editTextNome, editTextTelefone; private Button buttonS, buttonD, buttonL; private Pessoa p; private PessoaDao dao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextNome = findViewById(R.id.editTextNome); editTextTelefone = findViewById(R.id.editTextTelefone); buttonS = findViewById(R.id.buttonS); buttonD = findViewById(R.id.buttonD); buttonL = findViewById(R.id.buttonL); // necessário fazer o teste da versão >API 33 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { p = getIntent().getParcelableExtra("dado", Pessoa.class); } else { p = getIntent().getParcelableExtra("dado"); } if(p!=null){ editTextNome.setText(p.getNome().toString()); editTextTelefone.setText(p.getTelefone().toString()); } Banco db = Room.databaseBuilder(getApplicationContext(), Banco.class, "meu_banco") .allowMainThreadQueries().build(); dao = db.pessoaDao(); } public void clicar(View view) { if (view.getId() == R.id.buttonS) { if (p == null) { p = new Pessoa(); p.setNome(editTextNome.getText().toString()); p.setTelefone(editTextTelefone.getText().toString()); long retorno = dao.adicionar(p); if (retorno != -1) { Toast.makeText(MainActivity.this, "Salvo", Toast.LENGTH_SHORT).show(); p = null; editTextNome.setText(""); editTextTelefone.setText(""); } else { Toast.makeText(MainActivity.this, "Não salvo", Toast.LENGTH_SHORT).show(); } } else { p.setNome(editTextNome.getText().toString()); p.setTelefone(editTextTelefone.getText().toString()); int retorno = dao.atualizar(p); if (retorno != 0) { Toast.makeText(MainActivity.this, "Atualizado", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "Erro ao atualizar", Toast.LENGTH_SHORT).show(); } } } if (view.getId() == R.id.buttonL) { ArrayList<Pessoa> dados = (ArrayList<Pessoa>) dao.listar(); if (dados != null && !dados.isEmpty()) { Intent intent = new Intent(MainActivity.this, SegundaActivity.class); intent.putParcelableArrayListExtra("dados", dados); startActivity(intent); finish(); } else { Toast.makeText(MainActivity.this, "Sem dados", Toast.LENGTH_SHORT).show(); } } if (view.getId() == R.id.buttonD) { if (p != null) { int retorno = dao.excluir(p); if (retorno > 0) { Toast.makeText(MainActivity.this, "Deletado", Toast.LENGTH_SHORT).show(); p = null; editTextNome.setText(""); editTextTelefone.setText(""); } else { Toast.makeText(MainActivity.this, "Erro ao deletar", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(MainActivity.this, "Nenhum registro selecionado", Toast.LENGTH_SHORT).show(); } } } }
-
SegundaActivity.java
import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Build; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class SegundaActivity extends AppCompatActivity implements AdapterView.OnItemClickListener { private ListView listView; private ArrayAdapter<Pessoa> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_segunda); listView = findViewById(R.id.lista); // necessário fazer o teste da versão >API 33 ArrayList<Pessoa> dados; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { dados = getIntent().getParcelableArrayListExtra("dados", Pessoa.class); } else { dados = getIntent().getParcelableArrayListExtra("dados"); } if (dados == null) dados = new ArrayList<>(); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dados); listView.setAdapter(adapter); listView.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Pessoa p = (Pessoa) adapterView.getItemAtPosition(i); Intent intent = new Intent(SegundaActivity.this, MainActivity.class); intent.putExtra("dado", p); startActivity(intent); finish(); } }
Versão 2: Esse exemplo é uma adaptação do exemplo disponibilizado em: STACKOVERFLOW. Android Room One-to-Many Relationship. 2021. Disponível: https://stackoverflow.com/questions/66897173/android-room-one-to-many-relationship. Pergunta feita pelo usuário https://stackoverflow.com/users/328518/adil-bhatty e respondida pelo usuário https://stackoverflow.com/users/4744514/miket.
-
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textViewUm" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textViewDois" android:text="Hello World!" /> </LinearLayout>
-
Disciplina.java
import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "_disciplina") class Disciplina { @PrimaryKey @ColumnInfo(name = "disciplina_id") Long disciplinaId; @NonNull @ColumnInfo(name = "disciplina_nome") String disciplinaNome; Disciplina(){} @Ignore Disciplina(String disciplinaNome) { this.disciplinaNome = disciplinaNome; } }
-
Curso.java
import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "_curso") class Curso { @PrimaryKey @ColumnInfo(name = "curso_id") Long cursoid; @NonNull @ColumnInfo(name = "curso_nome") String cursoNome; Curso(){} @Ignore Curso(String cursoNome) { this.cursoNome = cursoNome; } }
-
Estudante.java
import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.ForeignKey; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity( tableName = "_estudante", foreignKeys = { @ForeignKey( entity = Curso.class, parentColumns = {"curso_id"}, childColumns = {"curso_id"}, onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE ), @ForeignKey( entity = Disciplina.class, parentColumns = {"disciplina_id"}, childColumns = {"disciplina_id"}, onDelete = ForeignKey.CASCADE, onUpdate = ForeignKey.CASCADE ) } ) class Estudante { @PrimaryKey @ColumnInfo(name = "estudante_id") Long estudanteId; @ColumnInfo(name = "estudante_nome") String estudanteNome; @ColumnInfo(name = "curso_id", index = true) Long cursoId; @ColumnInfo(name = "disciplina_id", index = true) Long disciplinaId; Estudante(){} @Ignore Estudante(String estudanteNome, long cursoId, long disciplinaId) { this.estudanteNome = estudanteNome; this.cursoId = cursoId; this.disciplinaId = disciplinaId; } }
-
MyDatabase.java
import androidx.room.Database; import androidx.room.RoomDatabase; @Database(entities = {Curso.class, Disciplina.class, Estudante.class} ,version = 1) public abstract class MyDatabase extends RoomDatabase { abstract AllDao allDao(); }
-
AllDao.java
import androidx.room.Dao; import androidx.room.Insert; import androidx.room.Query; import java.util.List; @Dao public interface AllDao { @Insert Long inserirCurso(Curso s); @Insert Long inserirDisciplina(Disciplina c); @Insert Long inserirEstudante(Estudante s); @Query("SELECT * FROM _curso") List<Curso> obterTodosCursos(); @Query("SELECT * FROM _curso WHERE curso_id = :curso_id ") Curso obterUmCurso(Long curso_id); @Query("SELECT * FROM _disciplina") List<Disciplina> obterTodasDisciplinas(); @Query("SELECT * FROM _disciplina WHERE disciplina_id = :disciplina_id") Disciplina obterUmaDisciplina(Long disciplina_id); @Query("SELECT * FROM _estudante " + "JOIN _curso ON _curso.curso_id = _estudante.estudante_id " + "JOIN _disciplina ON _disciplina.disciplina_id = _estudante.disciplina_id") List<EstudanteECursoEDisciplina> obterEstudanteECursoEDisciplina(); @Query("SELECT * FROM _estudante") List<EstudanteComCursoComDisciplina> obterEstudanteComCursoComDisciplina(); }
-
EstudanteComCursoComDisciplina.java
import androidx.room.Embedded; import androidx.room.Relation; import java.util.List; public class EstudanteComCursoComDisciplina { @Embedded Estudante estudante; @Relation(entity = Curso.class,parentColumn = "curso_id", entityColumn = "curso_id") List<Curso> cursoList; @Relation(entity = Disciplina.class,parentColumn = "disciplina_id", entityColumn = "disciplina_id") List<Disciplina> disciplinaList; }
-
EstudanteECursoEDisciplina.java
import androidx.room.Embedded; public class EstudanteECursoEDisciplina { @Embedded Estudante estudante; String curso_nome; String disciplina_nome; }
-
MainActivity.java
import android.os.Bundle; import android.util.Log; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import java.util.List; public class MainActivity extends AppCompatActivity { private MyDatabase db; private AllDao allDao; private TextView textViewUm, textViewDois; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewUm = findViewById(R.id.textViewUm); textViewDois = findViewById(R.id.textViewDois); db = Room.databaseBuilder(this, MyDatabase.class, "mydb") .allowMainThreadQueries() .build(); allDao = db.allDao(); Curso[] s_array = {new Curso("Curso1"), new Curso("Curso2"), new Curso("Curso3") }; for (Curso s : s_array) { allDao.inserirCurso(s); } Disciplina[] c_array = { new Disciplina("Disciplina1"), new Disciplina("Disciplina2"), new Disciplina("Disciplina3") }; for (Disciplina c : c_array) { allDao.inserirDisciplina(c); } Estudante[] st_array = { new Estudante("João", 3, 3), new Estudante("Maria", 1, 2) }; for (Estudante st : st_array) { allDao.inserirEstudante(st); } // usando POJO 1 (realtionship via joins) List<EstudanteECursoEDisciplina> sasac = allDao.obterEstudanteECursoEDisciplina(); StringBuilder dados = new StringBuilder(); for (EstudanteECursoEDisciplina ssc : sasac) { dados.append("ESTUDENTEINFO1: " + "Estudante Nome = " + ssc.estudante.estudanteNome + "\n\t ID=" + ssc.estudante.estudanteId + " CursoID=" + ssc.estudante.cursoId + " DisciplinaID=" + ssc.estudante.disciplinaId + "\n\t\t Curso Nome = " + ssc.curso_nome + "\n\t\t Disciplina Nome = " + ssc.disciplina_nome +"\n" ); } textViewUm.setText(dados.toString()); dados = new StringBuilder(); // usando POJO 2 (with @Relation's) List<EstudanteComCursoComDisciplina> swswc = allDao.obterEstudanteComCursoComDisciplina(); for (EstudanteComCursoComDisciplina ssc : swswc) { dados.append("ESTUDENTEINFO2: " + "Estudante Nome = " + ssc.estudante.estudanteNome + "\n\t ID=" + ssc.estudante.estudanteId + " CursoID=" + ssc.estudante.cursoId + " DisciplinaID=" + ssc.estudante.disciplinaId + "\n\t\t Curso Nome = " + ssc.cursoList.get(0).cursoNome + "\n\t\t Disciplina Nome = " + ssc.disciplinaList.get(0).disciplinaNome +"\n" ); } textViewDois.setText(dados.toString()); }//onCreate }//class
Versão 3: variações do exemplo anterior (versão 2)
Multiplicidade 1 para 1:
-
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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textViewResultado" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
Curso.java
import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "_curso") public class Curso { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "curso_id") public Long cursoId; @NonNull @ColumnInfo(name = "curso_nome") public String cursoNome; public Curso() {} @Ignore public Curso(String cursoNome) { this.cursoNome = cursoNome; } }
-
Disciplina.java
import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "_disciplina") public class Disciplina { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "disciplina_id") public Long disciplinaId; @NonNull @ColumnInfo(name = "disciplina_nome") public String disciplinaNome; public Disciplina() {} @Ignore public Disciplina(String disciplinaNome) { this.disciplinaNome = disciplinaNome; } }
-
Estudante.java
import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.ForeignKey; import androidx.room.Ignore; import androidx.room.Index; import androidx.room.PrimaryKey; @Entity( tableName = "_estudante", foreignKeys = { @ForeignKey( entity = Curso.class, parentColumns = "curso_id", childColumns = "curso_id", onDelete = ForeignKey.CASCADE ), @ForeignKey( entity = Disciplina.class, parentColumns = "disciplina_id", childColumns = "disciplina_id", onDelete = ForeignKey.CASCADE ) }, indices = { @Index(value = {"estudante_nome", "curso_id", "disciplina_id"}, unique = true) } ) public class Estudante { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "estudante_id") public Long estudanteId; @ColumnInfo(name = "estudante_nome") public String estudanteNome; @ColumnInfo(name = "curso_id", index = true) public Long cursoId; @ColumnInfo(name = "disciplina_id", index = true) public Long disciplinaId; public Estudante() {} @Ignore public Estudante(String estudanteNome, long cursoId, long disciplinaId) { this.estudanteNome = estudanteNome; this.cursoId = cursoId; this.disciplinaId = disciplinaId; } }
-
AppDao.java
import androidx.room.Dao; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import java.util.List; @Dao public interface AppDao { @Insert Long inserirCurso(Curso c); @Insert Long inserirDisciplina(Disciplina d); @Insert(onConflict = OnConflictStrategy.IGNORE) Long inserirEstudante(Estudante e); @Query("SELECT * FROM _curso") List<Curso> obterCursos(); @Query("SELECT * FROM _disciplina") List<Disciplina> obterDisciplinas(); @Query("SELECT * FROM _estudante") List<Estudante> obterEstudantes();
}
-
AppDatabase.java
import androidx.room.Database; import androidx.room.RoomDatabase; @Database( entities = {Curso.class, Disciplina.class, Estudante.class}, version = 1 ) public abstract class AppDatabase extends RoomDatabase { public abstract AppDao appDao(); }
-
MainActivity.java
import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import android.util.Log; import android.widget.TextView; import java.util.List; public class MainActivity extends AppCompatActivity { private TextView textViewResultado; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewResultado = findViewById(R.id.textViewResultado); AppDatabase db = Room.databaseBuilder( getApplicationContext(), AppDatabase.class, "escola.db" ).allowMainThreadQueries().build(); AppDao dao = db.appDao(); long cursoId = dao.inserirCurso(new Curso("Ciência da Computação")); long discId = dao.inserirDisciplina(new Disciplina("Banco de Dados")); dao.inserirEstudante(new Estudante("Ana", cursoId, discId)); List<Estudante> estudantes = dao.obterEstudantes(); String msg = null; for (Estudante e : estudantes) { msg = "Estudante: " + e.estudanteNome + " | cursoId=" + e.cursoId + " | disciplinaId=" + e.disciplinaId; Log.d("DB_TESTE", msg); } textViewResultado.setText(msg); } }
Multiplicidade N para N (sem duplicidade):
-
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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:id="@+id/textViewResultado" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
-
Curso.java
import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "_curso") public class Curso { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "curso_id") public Long cursoId; @NonNull @ColumnInfo(name = "curso_nome") public String cursoNome; public Curso() {} @Ignore public Curso(String cursoNome) { this.cursoNome = cursoNome; } }
-
Disciplina.java
import androidx.annotation.NonNull; import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity(tableName = "_disciplina") public class Disciplina { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "disciplina_id") public Long disciplinaId; @NonNull @ColumnInfo(name = "disciplina_nome") public String disciplinaNome; public Disciplina() {} @Ignore public Disciplina(String disciplinaNome) { this.disciplinaNome = disciplinaNome; } }
-
Estudante.java
import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.ForeignKey; import androidx.room.Ignore; import androidx.room.PrimaryKey; @Entity( tableName = "_estudante", foreignKeys = @ForeignKey( entity = Curso.class, parentColumns = "curso_id", childColumns = "curso_id", onDelete = ForeignKey.CASCADE ) ) public class Estudante { @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "estudante_id") public Long estudanteId; @ColumnInfo(name = "estudante_nome") public String estudanteNome; @ColumnInfo(name = "curso_id", index = true) public Long cursoId; public Estudante() {} @Ignore public Estudante(String estudanteNome, long cursoId) { this.estudanteNome = estudanteNome; this.cursoId = cursoId; } }
-
EstudanteDisciplinaCrossRef.java
import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.ForeignKey; @Entity( tableName = "_estudante_disciplina", primaryKeys = {"estudante_id", "disciplina_id"}, foreignKeys = { @ForeignKey( entity = Estudante.class, parentColumns = "estudante_id", childColumns = "estudante_id", onDelete = ForeignKey.CASCADE ), @ForeignKey( entity = Disciplina.class, parentColumns = "disciplina_id", childColumns = "disciplina_id", onDelete = ForeignKey.CASCADE ) } ) public class EstudanteDisciplinaCrossRef { @ColumnInfo(name = "estudante_id") public long estudanteId; @ColumnInfo(name = "disciplina_id") public long disciplinaId; public EstudanteDisciplinaCrossRef(long estudanteId, long disciplinaId) { this.estudanteId = estudanteId; this.disciplinaId = disciplinaId; } }
-
DisciplinaComEstudantes.java
import androidx.room.Embedded; import androidx.room.Junction; import androidx.room.Relation; import java.util.List; public class DisciplinaComEstudantes { @Embedded public Disciplina disciplina; @Relation( parentColumn = "disciplina_id", entityColumn = "estudante_id", associateBy = @Junction(EstudanteDisciplinaCrossRef.class) ) public List<Estudante> estudantes; }
-
EstudanteComDisciplinas.java
import androidx.room.Embedded; import androidx.room.Junction; import androidx.room.Relation; import java.util.List; public class EstudanteComDisciplinas { @Embedded public Estudante estudante; @Relation( parentColumn = "estudante_id", entityColumn = "disciplina_id", associateBy = @Junction(EstudanteDisciplinaCrossRef.class) ) public List<Disciplina> disciplinas; }
-
AppDatabase.java
import androidx.room.Database; import androidx.room.RoomDatabase; @Database( entities = { Curso.class, Disciplina.class, Estudante.class, EstudanteDisciplinaCrossRef.class }, version = 1 ) public abstract class AppDatabase extends RoomDatabase { public abstract AppDao appDao(); }
-
AppDao.java
import androidx.room.Dao; import androidx.room.Insert; import androidx.room.Query; import androidx.room.Transaction; import java.util.List; @Dao public interface AppDao { @Insert Long inserirCurso(Curso c); @Insert Long inserirDisciplina(Disciplina d); @Insert Long inserirEstudante(Estudante e); @Insert void inserirEstudanteDisciplina(EstudanteDisciplinaCrossRef crossRef); @Query("SELECT * FROM _estudante") List<Estudante> obterEstudantes(); @Query("SELECT * FROM _disciplina") List<Disciplina> obterDisciplinas(); @Transaction @Query("SELECT * FROM _estudante WHERE estudante_id = :id") EstudanteComDisciplinas obterEstudanteComDisciplinas(long id); @Transaction @Query("SELECT * FROM _disciplina WHERE disciplina_id = :id") DisciplinaComEstudantes obterDisciplinaComEstudantes(long id); }
-
MainActivity.java
import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.room.Room; import android.util.Log; import android.widget.TextView; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppDatabase db = Room.databaseBuilder( getApplicationContext(), AppDatabase.class, "escola_n_n.db" ).allowMainThreadQueries().build(); AppDao dao = db.appDao(); long cursoId = dao.inserirCurso(new Curso("Engenharia de Software")); long disc1Id = dao.inserirDisciplina(new Disciplina("Programação Mobile")); long disc2Id = dao.inserirDisciplina(new Disciplina("Inteligência Artificial")); long estId = dao.inserirEstudante(new Estudante("Ana", cursoId)); dao.inserirEstudanteDisciplina(new EstudanteDisciplinaCrossRef(estId, disc1Id)); dao.inserirEstudanteDisciplina(new EstudanteDisciplinaCrossRef(estId, disc2Id)); EstudanteComDisciplinas ec = dao.obterEstudanteComDisciplinas(estId); Log.d("DB_TESTE", "Estudante: " + ec.estudante.estudanteNome); for (Disciplina d : ec.disciplinas) { Log.d("DB_TESTE", " - Disciplina: " + d.disciplinaNome); } DisciplinaComEstudantes dc = dao.obterDisciplinaComEstudantes(disc1Id); Log.d("DB_TESTE", "Disciplina: " + dc.disciplina.disciplinaNome); for (Estudante e : dc.estudantes) { Log.d("DB_TESTE", " - Estudante: " + e.estudanteNome); } } }