Android 房间持久性库。掉落 Table
Android Room persistance library. Drop Table
我需要知道如何"DROP FROM Table" 使用 Room Persistence Library。
我已经知道我们可以使用以下方法删除所有行:
@Query("DELETE FROM table")
void deleteAll();
然而,我需要的是删除整个table。这是因为我的primary_key是自增列,所以用前面的代码,不休息
我已经在接下来的链接中阅读了有关此主题的答案:
- Reset auto-increment in Android's Room library
但是,我不敢相信这个库没有提供更简单的方法来做到这一点,无论出于何种原因或用途。
可以使用 Room 提供的迁移通过我们自己的查询更新数据库。因为我们想要对 Room 无法从代码解析(还)的数据库进行更改。我们可以删除 table、重新创建或更新它。视需要而定。
选项 1:迁移并保留其他数据
- 首先增加数据库的版本:更新
@Database
注解中的version
参数
- 像这样创建迁移:
static final Migration MIGRATION_1_2 = new Migration(1, 2) { // From version 1 to version 2
@Override
public void migrate(SupportSQLiteDatabase database) {
// Remove the table
database.execSQL("DROP TABLE my_table"); // Use the right table name
// OR: We could update it, by using an ALTER query
// OR: If needed, we can create the table again with the required settings
// database.execSQL("CREATE TABLE IF NOT EXISTS my_table (id INTEGER, PRIMARY KEY(id), ...)")
}
};
- 建库时添加迁移:
Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
.addMigration(MIGRATION_1_2) // Add the migration
.build();
- 运行 再次应用。如果查询正确,则迁移完成
选项 2:迁移 丢失 数据
还有一个快速选项,但是数据库中的所有数据都会被清除!
这是因为在使用以下方法时会重新创建数据库。
- 与选项一一样,增加数据库的
version
- 创建数据库时使用
.fallbackToDestructiveMigration()
,像这样:
Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
.fallbackToDestructiveMigration()
.build();
- 运行 应用程序。它将删除旧数据库并重新创建它。 (所有早期数据都被擦除)
如果您想通过自动迁移执行此操作,则需要使用 spec 作为 @Database 注释的 autoMigrations 值。看起来像
这个
autoMigrations = {@AutoMigration(from = 1, to = 2, spec = AppDatabase.MyAutoMigration.class)}
例如您想从数据库版本 1 中删除一个 table(YourTableName) 然后迁移到版本 2 那么完整的代码如下所示
@Database(
version = 2,
entities = {Entity1.class, Entity2.class},
autoMigrations = {@AutoMigration(from = 1, to = 2, spec = AppDatabase.MyAutoMigration.class)},
exportSchema = true)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
@DeleteTable.Entries(value = @DeleteTable(tableName = "YourTableName"))
public static class MyAutoMigration implements AutoMigrationSpec {
}
// Your DAO 1
// Your DAO 2
}
我需要知道如何"DROP FROM Table" 使用 Room Persistence Library。
我已经知道我们可以使用以下方法删除所有行:
@Query("DELETE FROM table")
void deleteAll();
然而,我需要的是删除整个table。这是因为我的primary_key是自增列,所以用前面的代码,不休息
我已经在接下来的链接中阅读了有关此主题的答案:
- Reset auto-increment in Android's Room library
但是,我不敢相信这个库没有提供更简单的方法来做到这一点,无论出于何种原因或用途。
可以使用 Room 提供的迁移通过我们自己的查询更新数据库。因为我们想要对 Room 无法从代码解析(还)的数据库进行更改。我们可以删除 table、重新创建或更新它。视需要而定。
选项 1:迁移并保留其他数据
- 首先增加数据库的版本:更新
@Database
注解中的version
参数 - 像这样创建迁移:
static final Migration MIGRATION_1_2 = new Migration(1, 2) { // From version 1 to version 2
@Override
public void migrate(SupportSQLiteDatabase database) {
// Remove the table
database.execSQL("DROP TABLE my_table"); // Use the right table name
// OR: We could update it, by using an ALTER query
// OR: If needed, we can create the table again with the required settings
// database.execSQL("CREATE TABLE IF NOT EXISTS my_table (id INTEGER, PRIMARY KEY(id), ...)")
}
};
- 建库时添加迁移:
Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
.addMigration(MIGRATION_1_2) // Add the migration
.build();
- 运行 再次应用。如果查询正确,则迁移完成
选项 2:迁移 丢失 数据
还有一个快速选项,但是数据库中的所有数据都会被清除!
这是因为在使用以下方法时会重新创建数据库。
- 与选项一一样,增加数据库的
version
- 创建数据库时使用
.fallbackToDestructiveMigration()
,像这样:
Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
.fallbackToDestructiveMigration()
.build();
- 运行 应用程序。它将删除旧数据库并重新创建它。 (所有早期数据都被擦除)
如果您想通过自动迁移执行此操作,则需要使用 spec 作为 @Database 注释的 autoMigrations 值。看起来像 这个
autoMigrations = {@AutoMigration(from = 1, to = 2, spec = AppDatabase.MyAutoMigration.class)}
例如您想从数据库版本 1 中删除一个 table(YourTableName) 然后迁移到版本 2 那么完整的代码如下所示
@Database(
version = 2,
entities = {Entity1.class, Entity2.class},
autoMigrations = {@AutoMigration(from = 1, to = 2, spec = AppDatabase.MyAutoMigration.class)},
exportSchema = true)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
@DeleteTable.Entries(value = @DeleteTable(tableName = "YourTableName"))
public static class MyAutoMigration implements AutoMigrationSpec {
}
// Your DAO 1
// Your DAO 2
}