22 Datenbanken

Die Verwaltung von Daten ist ein wichtiger Aspekt der Android-Entwicklung. In Android gibt es verschiedene Möglichkeiten, Daten zu speichern und zu verwalten, einschließlich Datenbanken und das Dateisystem.

Datenbanken in Android

SQLite ist eine leichtgewichtige, dateibasierte Datenbank, die in Android eingebettet ist. Sie bietet eine umfangreiche SQL-Schnittstelle und ist ideal für die Speicherung strukturierter Daten.

Um mit SQLite-Datenbanken in Android zu arbeiten, können Sie die SQLiteDatabase-Klasse und verwandte APIs verwenden. Allerdings kann dies ziemlich umständlich sein. Daher hat Google die Room-Persistence-Bibliothek eingeführt, die eine Abstraktionsschicht über SQLite bietet und das Arbeiten mit Datenbanken viel einfacher macht.

Mit Room definieren Sie Entitäten (Datenmodelle) und Datenzugriffsobjekte (DAOs). Room generiert dann den notwendigen Code, um CRUD-Operationen (Erstellen, Lesen, Aktualisieren, Löschen) auf Ihren Entitäten durchzuführen.

Es ist auch wichtig zu beachten, dass alle Datenbankoperationen auf einem Hintergrundthread ausgeführt werden müssen, um den Hauptthread nicht zu blockieren. Room unterstützt Coroutines und RxJava, die das Arbeiten mit Hintergrundthreads erleichtern.

In Android gibt es verschiedene Möglichkeiten, auf Datenbanken zuzugreifen. Die beiden Hauptmethoden sind die direkte Verwendung der SQLite-API und die Verwendung der Room Persistence Library. Hier sind Beispiele für beide:

SQLite-API

Hier ist ein einfacher Code, der zeigt, wie man eine SQLite-Datenbank erstellt und eine einfache Abfrage ausführt:

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "Student.db";
    public static final String TABLE_NAME = "student_table";
    public static final String COL_1 = "ID";
    public static final String COL_2 = "NAME";
    public static final String COL_3 = "MARKS";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_NAME 
        +" (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,MARKS INTEGER)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
        onCreate(db);
    }

    public Cursor getAllData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
        return res;
    }
}

In diesem Beispiel wird zuerst eine SQLiteOpenHelper-Subklasse erstellt, die dazu dient, eine Datenbank zu erstellen und zu aktualisieren. Die Methode getAllData() gibt ein Cursor-Objekt zurück, das die Ergebnisse einer “SELECT *“-Abfrage auf der Datenbank enthält.

Room Persistence Library

Die Room-Persistence-Bibliothek ist eine Abstraktionsschicht über SQLite, die das Arbeiten mit Datenbanken einfacher macht. Hier ist ein einfaches Beispiel, wie man Room verwendet:

@Entity
public class User {
    @PrimaryKey
    public int id;

    public String firstName;
    public String lastName;
}

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

In diesem Beispiel definiert die @Entity-Annotation eine SQLite-Tabelle. Jedes Feld in der Klasse repräsentiert eine Spalte in der Tabelle. Die @Dao-Annotation definiert eine Schnittstelle für den Zugriff auf die Datenbank. Jede Methode in der Schnittstelle repräsentiert eine SQL-Abfrage. Schließlich repräsentiert die @Database-Annotation eine Datenbank-Halter-Klasse. Jede Datenbank wird durch eine abstrakte Klasse definiert, die von RoomDatabase erweitert wird.

Bitte beachten Sie, dass diese Codebeispiele nur grundlegende Operationen zeigen. In einer echten App würden Sie wahrscheinlich weitere Funktionen wie Transaktionen, Fehlerbehandlung und so weiter benötigen.