[Android / Java] Betreiben Sie eine lokale Datenbank in Room

Umgebung

Basic

--Erstellen Sie eine Entitätsklasse mit @ Entity. --Erstelle eine Klasse, die Entitäten mit @ Dao bearbeitet. --Erstellen Sie eine Klasse, die RoomDatabase erbt, und registrieren Sie die Klasse mit @ Dao als Mitglied. --Betreiben Sie eine Klasse, die "RoomDatabase" von der App erbt

Beachten Sie, dass Klassen, die von "RoomDatabase" erben, nicht für den Hauptthread ausgeführt werden können.

Beispiel für die Klasse "@ Entity"

@Entity(indices = {@Index(value = {"name"}, unique = true)})
public class User {
	@PrimaryKey
	public long id;

	@ColumnInfo
	public String name;
}

Beispiel für eine @ Dao-Klasse

@Dao
public abstract class UserDao {
	@Query("select id from user order by id desc limit 1")
	public abstract long getMaxId();

	@Insert(onConflict = OnConflictStrategy.IGNORE)
	abstract void insert(User user);

	@Query("delete from user where id = :id")
	abstract void delete(long id);
}

Beispiel für die Vererbungsklasse RoomDatabase

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

Beispiel einer Singleton-Klasse, die eine DB-Instanz erstellt

public class AppDatabaseSingleton {
	private static AppDatabase instance = null;
	private AppDatabaseSingleton() {}

	public static AppDatabase getInstance(Context context) {
		if (instance != null) {
			return instance;
		}
		instance =  Room.databaseBuilder(context,
				AppDatabase.class, "app_database").build();
		return instance;
	}
}

Beispiel für einen Datenbankbetrieb

new Thread(new Runnable() {
	@Override
	public void run() {
		AppDatabase db = AppDatabaseSingleton.getInstance(context);
		long maxId = db.UserDao().getMaxId();
		callback.onComplete(maxId);
	}
}).start();

Geben Sie den Tabellennamen an

Schreiben Sie in @ Entity as (tableName = {" table name "). Wenn Sie es nicht angeben, wird eine Tabelle mit demselben Namen wie der Modellname erstellt. Es ist daher besser, sie nach Möglichkeit anzugeben.

@Entity(tableName = "users")
public class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Erstellen Sie eine Spalte, die Sie in Ihrem Modell, aber nicht in Ihrer Datenbank haben möchten

Schreiben Sie "@ Ignore" vor den Spaltennamen.

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

    public String firstName;
    public String lastName;

    @Ignore
    Bitmap picture;
}

Eindeutiger Index für mehrere Spalten

Schreiben Sie (indeces = {@Index (value = {" erste Spalte "," zweite Spalte "}, unique = true)}) in @ Entity.

@Entity(indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})
public class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Ich möchte mehrere Elemente gleichzeitig festlegen

Schreiben Sie durch Kommas getrennt

@Entity(tableName = "users",
        indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})

Ich möchte so etwas wie INSERT IGNORE machen

Zunächst müssen Sie eine Abfrage mit "@ Dao" anstelle von "@ Entity" ausführen.

Fügen Sie (onConflict = OnConflictStrategy.IGNORE) zu @ Insert hinzu. Wenn Sie es ersetzen möchten, verwenden Sie (onConflict = OnConflictStrategy.REPLACE).

@Dao
public interface MyDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    public void insertUsers(User... users);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertBothUsers(User user1, User user2);

    @Insert
    public void insertUsersAndFriends(User user, List<User> friends);
}

Ich möchte eine Transaktion durchführen

Wenn Sie handeln möchten, müssen Sie von "Schnittstelle" zu "abstrakte Klasse" wechseln. Geben Sie dann "@ Transaction" als Zielmethode an.

@Dao
abstract class UsersDao {
    @Transaction
    public void setLoggedInUser(User loggedInUser) {
        deleteUser(loggedInUser);
        insertUser(loggedInUser);
    }

    @Query("DELETE FROM users")
    abstract void deleteUser(User user);

    @Insert
    abstract void insertUser(User user);
}

Ich möchte später weitere Tabellen und Spalten hinzufügen

Erhöhen Sie die Version wie in SQLite. Wenn Sie es nur erhöhen, wird nichts getan, also müssen Sie schreiben, was zu tun ist. Wenn Sie es nicht schreiben, werden Sie wütend.

A migration from 1 to 2 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.

Die Fehlermeldung sagt Ihnen freundlicherweise, was zu tun ist. Kurz gesagt, tun Sie es einfach. Wenn Sie beispielsweise ein Upgrade auf Version 3 durchführen, eine "Fruit" -Tabelle in Version 2 hinzufügen und eine "Integer" -Spalte mit dem Namen "pub_year" zur "Book" -Tabelle in Version 3 hinzufügen, erhalten Sie:

@Database(entities = {Fruit.class, Book.class}, version = 3)
public abstract class AppDatabase extends RoomDatabase {
	:
	public static AppDatabase getInstance(Context context) {
		if (instance != null) {
			return instance;
		}
		static final Migration MIGRATION_1_2 = new Migration(1, 2) {
			@Override
			public void migrate(@NonNull SupportSQLiteDatabase database) {
				database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
						+ "`name` TEXT, PRIMARY KEY(`id`))");
			}
		};
		static final Migration MIGRATION_2_3 = new Migration(2, 3) {
			@Override
			public void migrate(@NonNull SupportSQLiteDatabase database) {
				database.execSQL("ALTER TABLE Book "
						+ " ADD COLUMN pub_year INTEGER");
			}
		};
		instance =  Room.databaseBuilder(context,
				AppDatabase.class, "database-name")
				.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
				.build();
		return instance;
	}
}

Ich möchte, dass Sie diesen Bereich gut einwickeln, aber im Moment gibt es ein Gefühl menschlicher Macht. Es kann relativ einfach sein, das Tabellenerstellungs-SQL usw. zu verwenden, da es sich auf den erweiterten Raum bezieht. Wenn Sie beispielsweise eine geerbte Klasse für "RoomDatabase" mit dem Klassennamen "com.example.db.AppDatabase" erstellt haben, dann "app / build / generate / source / apt / debug / com / example / db / AppDatabase_Impl.java" Der auf `erweiterte Inhalt wird ausgegeben. Das Folgende ist ein Beispiel für "AppDatabase_Impl".

@SuppressWarnings({"unchecked", "deprecation"})
public final class AppDatabase_Impl extends AppDatabase {
  @Override
  protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration configuration) {
    final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(configuration, new RoomOpenHelper.Delegate(2) {
      @Override
      public void createAllTables(SupportSQLiteDatabase _db) {
        _db.execSQL("CREATE TABLE IF NOT EXISTS `Fruit` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))");
        :
      }
      :
    }
  }
}

Referenz

Andere

Googles geringe Googleabilität Wie kann ich es benennen, was kann ich tun ...

Recommended Posts

[Android / Java] Betreiben Sie eine lokale Datenbank in Room
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
Suchen Sie eine Teilmenge in Java
Lesen Sie WAV-Daten als Byte-Array unter Android Java
Versuchen Sie, Android Hilt in Java zu implementieren
3 Implementieren Sie einen einfachen Interpreter in Java
Ich habe ein PDF mit Java erstellt.
Erstellen Sie eine Datenbank in einer Produktionsumgebung
Ein einfaches Beispiel für Rückrufe in Java
Bleiben Sie in einem Java Primer stecken
Erstellen Sie ein klares Zeitranking mit der Echtzeitdatenbank von Firebase (Android-App)
So bedienen Sie automatisch einen in Java unter Windows erstellten Bildschirm
Feststellen, ob eine benutzerdefinierte Tastatur in Android Studio (Java) aktiviert ist
Informationen zum Zurückgeben einer Referenz in einem Java Getter
Was ist eine Klasse in der Java-Sprache (3 /?)
Bei der Suche nach mehreren in einem Java-Array
So erstellen Sie eine Zip-Datei beim Gruppieren von Datenbanksuchergebnissen in Java
[Erstellen] Ein Memorandum über das Codieren in Java
Java erstellt eine Tabelle in einem Word-Dokument
Java erstellt ein Kreisdiagramm in Excel
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist eine Klasse in der Java-Sprache (2 /?)
Erstellen Sie eine TODO-App in Java 7 Create Header
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Implementieren Sie so etwas wie einen Stack in Java
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Erstellen einer Matrixklasse in Java Teil 1
[Android Studio] Beschreibung, die kontinuierlich in die SQLite-Datenbank eingegeben werden kann [Java]
Von Java nach C und von C nach Java in Android Studio
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
GetInstance () aus einer @ Singleton-Klasse in Groovy aus Java
Zwei Möglichkeiten, einen Thread in Java + @ zu starten
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Eine Geschichte über das JDK in der Java 11-Ära
So zeigen Sie eine Webseite in Java an
Messen Sie die Größe eines Ordners mit Java
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Informationen zu in Java verwendeten Variablen (lokaler Variablentyp)
[Java] Verwendung von final in der lokalen Variablendeklaration
Ein Hinweis, wenn Sie Tupel in Java möchten
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe ein Programm zur Beurteilung von Primzahlen in Java geschrieben
Lassen Sie uns mit Java ein supereinfaches Webframework erstellen
Löschen Sie alle Datensätze in einer Tabelle in einer MySQL-Datenbank
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Die Geschichte des Versuchs, JAVA File zu bedienen
Eine Bat-Datei, die Java in Windows verwendet
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
Ein kurzer Überblick über Java, das im Unterricht gelernt wurde
Ich habe ein Primfaktorisierungsprogramm in Java geschrieben
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
Partisierung in Java
Änderungen in Java 11
Janken in Java
Umfangsrate in Java
Lokale Java-Klasse
FizzBuzz in Java
[Android / Java] Bildschirmübergang und Rückgabeverarbeitung in Fragmenten
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden