Wie würdest du eine Datenbank erstellen?
sobes.tech KI
Antwort von AI
Ich verwende die Room Persistence Library.
-
Hinzufügen der Abhängigkeiten:
// build.gradle (auf App-Ebene) dependencies { def room_version = "2.5.2" // oder die aktuelle Version implementation("androidx.room:room-runtime:$room_version") annotationProcessor("androidx.room:room-compiler:$room_version") // Für Kotlin benutze kapt("...") // Optional: Kotlin Extensions und Coroutines-Unterstützung für Room implementation("androidx.room:room-ktx:$room_version") } -
Definition der Entities (Tabellen):
Erstelle eine Klasse, die mit
@Entityannotiert ist. Jedes Feld wird eine Spalte, und@PrimaryKeyist der Primärschlüssel.// 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; } -
Definition des DAO (Data Access Object):
Erstelle eine Schnittstelle, die mit
@Daoannotiert ist, mit Methoden zum Zugriff auf die Daten (einfügen, aktualisieren, löschen, abfragen).// 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); } -
Definition der Datenbank:
Erstelle eine abstrakte Klasse, die
RoomDatabaseerweitert, mit@Databaseannotiert. Enthält die Liste der Entities und DAOs.// 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(); } -
Initialisierung der Datenbank:
Erhalte eine Instanz der Datenbank, meist in der Application-Klasse oder in einer Activity (besser in der Application für ein Singleton).
// In der Activity- oder Application-Klasse 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() // Nicht empfohlen für Produktion // .fallbackToDestructiveMigration() // Vorsicht bei Migrationen .build(); } return db; } } -
Ausführen von Datenoperationen:
Mit der DAO-Instanz führe ich Datenbankoperationen aus, vorzugsweise in einem Hintergrund-Thread (z.B. mit
AsyncTask,Executors, Coroutines, RxJava).// In der Activity oder an anderer Stelle new Thread(() -> { AppDatabase db = DatabaseInitializer.getDatabase(getApplicationContext()); UserDao userDao = db.userDao(); // Einfügen User user1 = new User(); user1.firstName = "John"; user1.lastName = "Doe"; userDao.insertAll(user1); // Lesen List<User> allUsers = userDao.getAll(); // ... Datenverarbeitung }).start();
Dieser Ansatz bietet eine Abstraktion über SQLite, vereinfach die Datenbankverwaltung und bietet Kompilierungszeit-Überprüfung der Abfragen.