Android Room 持久化库。删除表

Car*_*ela 8 android android-library android-room

我需要知道如何使用 Room Persistence 库“从表中删除”。

我已经知道我们可以使用以下方法删除所有行:

@Query("DELETE FROM table")
void deleteAll();
Run Code Online (Sandbox Code Playgroud)

但是,我需要的是删除整个表。这是因为我的primary_key是一个自增列,所以使用前面的代码,没有休息。

我已经在以下链接中阅读了有关此主题的答案:

但是,我无法相信这个库没有提供更简单的方法来做到这一点,无论原因或用途如何。

Ale*_*lex 12

可以使用 Room 提供的迁移通过我们自己的查询更新数据库。因为我们想对 Room 无法从代码中解析的数据库进行更改。我们可以删除该表,重新创建它或更新它。取决于需要什么。

选项 1:迁移并保留其他数据

  1. 首先增加数据库的版本:更新version参数中的@Database注解中。
  2. 创建这样的迁移:
    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), ...)")
        }
    };
Run Code Online (Sandbox Code Playgroud)
  1. 建库时添加迁移:
    Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
        .addMigration(MIGRATION_1_2) // Add the migration
        .build();
Run Code Online (Sandbox Code Playgroud)
  1. 再次运行应用程序。如果查询正确,则迁移完成

选项 2:在丢失数据的情况下迁移

还有一个快速选项,但数据库中的所有数据都将被清除

这是因为使用以下方法时会重新创建数据库。

  1. 像选项一一样,增加version数据库的
  2. .fallbackToDestructiveMigration()创建数据库时使用,如下所示:
    Room.databaseBuilder(context, MyDatabase.class, "mydatabase")
        .fallbackToDestructiveMigration()
        .build();
Run Code Online (Sandbox Code Playgroud)
  1. 运行应用程序。它将删除旧数据库并重新创建它。(之前的所有数据都被擦除了)

  • 我尝试了第二种选择。但是,我添加了一个名为 ID 的额外列,现在我的应用程序崩溃,提示列“id”不存在。您能帮我解决这个问题吗?谢谢。 (2认同)