Comment créeriez-vous une base de données?
sobes.tech IA
Réponse de l'IA
J'utilise la bibliothèque Room Persistence.
-
Ajout des dépendances :
// build.gradle (niveau app) dependencies { def room_version = "2.5.2" // ou la version actuelle implementation("androidx.room:room-runtime:$room_version") annotationProcessor("androidx.room:room-compiler:$room_version") // Pour Kotlin, utilisez kapt("...") // Optionnel : support des extensions Kotlin et des coroutines pour Room implementation("androidx.room:room-ktx:$room_version") } -
Définition des entités (tables) :
Je crée une classe annotée avec
@Entity. Chaque champ sera une colonne, et@PrimaryKeysera la clé primaire.// User.java import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; public String firstName; public String lastName; } -
Définition du DAO (Objet d'Accès aux Données) :
Je crée une interface annotée avec
@Dao, avec des méthodes pour accéder aux données (insertion, mise à jour, suppression, requête).// UserDao.java import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import java.util.List; @Dao public interface UserDao { @Query("SELECT * FROM users") List<User> getAll(); @Query("SELECT * FROM users WHERE id IN (:userIds)") List<User> loadAllByIds(int[] userIds); @Query("SELECT * FROM users WHERE first_name LIKE :first AND " + "last_name LIKE :last LIMIT 1") User findByName(String first, String last); @Insert(onConflict = OnConflictStrategy.IGNORE) void insertAll(User... users); @Delete void delete(User user); @Update void updateUsers(User... users); } -
Définition de la base de données :
Je crée une classe abstraite qui étend
RoomDatabase, annotée avec@Database. J'inclus la liste des entités et le DAO.// AppDatabase.java import androidx.room.Database; import androidx.room.RoomDatabase; @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); } -
Initialisation de la base de données :
J'obtiens une instance de la base de données, généralement dans la classe Application ou dans une Activity (mais il est préférable dans Application pour un singleton).
// Dans la classe Activity ou Application import android.content.Context; import androidx.room.Room; public class DatabaseInitializer { private static AppDatabase db; public static synchronized AppDatabase getDatabase(Context context) { if (db == null) { db = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database-name") // .allowMainThreadQueries() // Non recommandé pour la production // .fallbackToDestructiveMigration() // Faites attention aux migrations .build(); } return db; } } -
Exécution des opérations sur les données :
Avec l'instance du DAO, j'exécute des opérations sur la base de données, de préférence dans un thread en arrière-plan (par exemple, en utilisant
AsyncTask,Executors, Coroutines, RxJava).// Dans l'Activity ou ailleurs new Thread(() -> { AppDatabase db = DatabaseInitializer.getDatabase(getApplicationContext()); UserDao userDao = db.userDao(); // Insertion User user1 = new User(); user1.firstName = "John"; user1.lastName = "Doe"; userDao.insertAll(user1); // Lecture List<User> allUsers = userDao.getAll(); // ... traitement des données }).start();
Cette approche fournit une abstraction sur SQLite, simplifie la gestion de la base de données et offre une vérification des requêtes à la compilation.