--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.
@Entity(indices = {@Index(value = {"name"}, unique = true)})
public class User {
@PrimaryKey
public long id;
@ColumnInfo
public String name;
}
@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);
}
RoomDatabase
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
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;
}
}
new Thread(new Runnable() {
@Override
public void run() {
AppDatabase db = AppDatabaseSingleton.getInstance(context);
long maxId = db.UserDao().getMaxId();
callback.onComplete(maxId);
}
}).start();
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;
}
Schreiben Sie "@ Ignore" vor den Spaltennamen.
@Entity
public class User {
@PrimaryKey
public int id;
public String firstName;
public String lastName;
@Ignore
Bitmap picture;
}
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;
}
Schreiben Sie durch Kommas getrennt
@Entity(tableName = "users",
indices = {@Index(value = {"first_name", "last_name"},
unique = true)})
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);
}
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);
}
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`))");
:
}
:
}
}
}
Googles geringe Googleabilität Wie kann ich es benennen, was kann ich tun ...
Recommended Posts