1. Description
Room fait partie d'Android Jetpack, qui fournit une couche d'abstraction basée sur SQLite. Cet article implémente une démo utilisant Room combinée avec LiveData et ViewModel.
Deux exemples
1. Ajouter des dépendances
build.gradle (Module : app) ajouter des dépendances
// Room components
dependencies {
// Room components
implementation "androidx.room:room-runtime:$rootProject.roomVersion"
annotationProcessor "androidx.room:room-compiler:$rootProject.roomVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"
// Lifecycle components
implementation "androidx.lifecycle:lifecycle-extensions:$rootProject.archLifecycleVersion"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$rootProject.archLifecycleVersion"
// UI
implementation "com.google.android.material:material:$rootProject.materialVersion"
}
build.gradle (Projet : room_java) remplissez le numéro de version, le numéro de version peut être obtenu à partir d' ici
ext {
roomVersion = '2.2.5'
archLifecycleVersion = '2.2.0'
materialVersion = '1.0.0'
}
2. Classe d'entité
@Entity(tableName = "feizai_table")
public class Feizai {
@PrimaryKey
@NonNull
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "second_name")
private String secondName;
@NonNull
public String getFirstName() {
return firstName;
}
public void setFirstName(@NonNull String firstName) {
this.firstName = firstName;
}
public String getSecondName() {
return secondName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
}
3. Interface Dao
Notez que la base de données DAO est une interface . Lors de la suppression et de la modification, une classe Feizai est transmise, mais elle sera modifiée et supprimée en fonction de la clé primaire de la base de données correspondante dans la classe Feizai, c'est-à-dire que peu importe les autres champs de la classe Feizai, mais il opèrera sur la base de données en fonction de la valeur du champ correspondant de la clé primaire. Le but de l'utilisation de LiveData est de surveiller la base de données et d'actualiser l'interface en temps réel.
@Dao
public interface FeizaiDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insert(Feizai feizai);
@Query("SELECT * FROM feizai_table")
LiveData<List<Feizai>> getAllFeizai();
@Delete(entity = Feizai.class)
void delete(Feizai feizai);
@Update(entity = Feizai.class)
void update(Feizai feizai);
}
4. Classe de base de données
Lors de la modification de la base de données, vous devez mettre à niveau la version de la base de données, c'est-à-dire version+1, et ajouter des opérations de base de données dans addMigrations. Si vous souhaitez réduire les champs de la table de base de données, vous pouvez créer une table temporaire, puis migrer les données vers la table temporaire, supprimer l'ancienne table de base de données, puis créer une table de base de données portant le même nom que l'ancienne base de données, puis migrez les données de la table temporaire vers la nouvelle base de données Dans la table, supprimez la table de base de données temporaire pour supprimer les champs de la base de données et enregistrer les anciennes données.
@Database(entities = {
Feizai.class}, version = 1, exportSchema = false)
public abstract class FeizaiDatabase extends RoomDatabase {
public abstract FeizaiDao getFeizaiDao();
private static volatile FeizaiDatabase INSTANCE;
private static final int NUMBER_OF_THREADS = 4;
public static final ExecutorService databaseWriteExecutor =
Executors.newFixedThreadPool(NUMBER_OF_THREADS);
public static FeizaiDatabase getDatabase(Context context) {
if (INSTANCE == null) {
synchronized (FeizaiDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
FeizaiDatabase.class, "Feizai.db")
.addMigrations(MIGRATION_1_2)
.build();
}
}
}
return INSTANCE;
}
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE feizai_table ADD COLUMN sex STRING");
}
};
}
5. Classe de référentiel
public class FeizaiRepository {
private FeizaiDao mFeizaiDao;
private LiveData<List<Feizai>> mFeizais;
public FeizaiRepository(Application application) {
FeizaiDatabase db = FeizaiDatabase.getDatabase(application);
mFeizaiDao = db.getFeizaiDao();
mFeizais = mFeizaiDao.getAllFeizai();
}
public LiveData<List<Feizai>> getAllFeizais() {
return mFeizais;
}
public void insert(Feizai feizai) {
FeizaiDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mFeizaiDao.insert(feizai);
mFeizais = mFeizaiDao.getAllFeizai();
}
});
}
public void delete(Feizai feizai) {
WordRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mFeizaiDao.delete(feizai);
}
});
}
public void update(Feizai feizai) {
WordRoomDatabase.databaseWriteExecutor.execute(new Runnable() {
@Override
public void run() {
mFeizaiDao.update(feizai);
}
});
}
}
6. Classe ViewModel
public class FeizaiViewModel extends AndroidViewModel {
private FeizaiRepository mReposity;
private LiveData<List<Feizai>> mAllFeizais;
public FeizaiViewModel (Application application) {
super(application);
mReposity = new FeizaiRepository(application);
mAllFeizais = mReposity.getAllFeizais();
}
public LiveData<List<Feizai>> getmAllFeizais() {
return mAllFeizais;
}
public void insert(Feizai feizai) {
mReposity.insert(feizai);
}
public void delete(Feizai feizai) {
mReposity.delete(feizai);
}
public void update(Feizai feizai) {
mReposity.update(feizai);
}
}
7. document feizai_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="4dp"
style="@style/word_title">
<TextView
android:id="@+id/item_first"
android:layout_marginVertical="10dp"
android:layout_width ="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/item_second"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
8. activité_feizai.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=".FeizaiActivity">
<EditText
android:id="@+id/first_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:hint="First Name"/>
<EditText
android:id="@+id/second_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/first_name"
android:hint="Second Name"/>
<Button
android:id="@+id/btn_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/second_name"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/delete"
android:text="@string/insert"/>
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/second_name"
app:layout_constraintLeft_toRightOf="@id/btn_add"
app:layout_constraintRight_toRightOf="parent"
android:text="@string/delete"/>
<Button
android:id="@+id/btn_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/btn_add"
app:layout_constraintLeft_toLeftOf="@id/btn_add"
android:text="@string/update"/>
<Button
android:id="@+id/insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/delete"
app:layout_constraintLeft_toLeftOf="@id/delete"
android:text="占坑"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rc_feizai"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="6dp"
app:layout_constraintTop_toBottomOf="@id/btn_update"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
9. FeizaiListAdapter类
public class FeizaiListAdapter extends RecyclerView.Adapter<FeizaiListAdapter.FeizaiViewHolder> {
private final LayoutInflater mInflater;
private List<Feizai> mFeizais;
public FeizaiListAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public FeizaiViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = mInflater.inflate(R.layout.feizai_item, parent, false);
return new FeizaiViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull FeizaiViewHolder holder, int position) {
if (mFeizais != null) {
Feizai current = mFeizais.get(position);
holder.itemFirst.setText(current.getFirstName());
holder.itemSecond.setText(current.getSecondName());
} else {
holder.itemFirst.setText("没有查到肥仔");
holder.itemSecond.setText("没有查到肥仔");
}
}
@Override
public int getItemCount() {
if (mFeizais == null)
return 0;
return mFeizais.size();
}
public void setFeizai(List<Feizai> feizais) {
mFeizais = feizais;
notifyDataSetChanged();
}
class FeizaiViewHolder extends RecyclerView.ViewHolder {
private final TextView itemFirst;
private final TextView itemSecond;
private FeizaiViewHolder(View itemView) {
super(itemView);
itemFirst = itemView.findViewById(R.id.item_first);
itemSecond = itemView.findViewById(R.id.item_second);
}
}
}
10. Activités Feizai
public class FeizaiActivity extends AppCompatActivity {
private FeizaiViewModel mFeizaiViewModel;
private FeizaiListAdapter adapter;
RecyclerView rv;
EditText firstName, secondName;
Button add, delete, insert, update;
Feizai feizai;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_feizai);
initView();
feizai = new Feizai();
mFeizaiViewModel = new ViewModelProvider(this).get(FeizaiViewModel.class);
mFeizaiViewModel.getmAllFeizais().observe(this, feizais -> adapter.setFeizai(feizais));
}
private void initView() {
add = findViewById(R.id.btn_add);
insert = findViewById(R.id.insert);
delete = findViewById(R.id.delete);
update = findViewById(R.id.btn_update);
rv = findViewById(R.id.rc_feizai);
firstName = findViewById(R.id.first_name);
secondName = findViewById(R.id.second_name);
adapter = new FeizaiListAdapter(this);
rv.setAdapter(adapter);
rv.setLayoutManager(new LinearLayoutManager(this));
add.setOnClickListener(v -> {
if (TextUtils.isEmpty(firstName.getText().toString()) && TextUtils.isEmpty(secondName.getText().toString())) {
return;
}
feizai.setFirstName(firstName.getText().toString());
feizai.setSecondName(secondName.getText().toString());
mFeizaiViewModel.insert(feizai);
});
delete.setOnClickListener(v -> {
if (TextUtils.isEmpty(firstName.getText().toString())) {
return;
}
feizai.setFirstName(firstName.getText().toString());
feizai.setSecondName(secondName.getText().toString());
mFeizaiViewModel.delete(feizai);
});
update.setOnClickListener(v -> {
if (TextUtils.isEmpty(firstName.getText().toString())) {
return;
}
feizai.setFirstName(firstName.getText().toString());
feizai.setSecondName(secondName.getText().toString());
mFeizaiViewModel.update(feizai);
});
}
}
11. Rendus
PS : si les débutants ont des doutes, vous pouvez vous rendre sur le site officiel pour vérifier les détails pertinents.