31

我有一种情况,我希望能够使用 Android Room 对我的数据库进行硬重置。使用SQLiteOpenHelper,我可以通过编写一个方法来删除所有表和索引,然后手动调用SQLiteOpenHelper.onCreate().

我知道我可以进入一个SupportSQLiteOpenHelper通过房间并自己放下所有桌子,但似乎没有一个很好的方法来开始娱乐过程。

另外,我知道我可以删除每个表中的每个项目而不删除它,但这不是我想要的。这不会重置自动递增的主键,因此新项目的“id”字段不会重置回 1。

谢谢!

编辑:
这是我希望能够在运行时任意做的事情。

编辑 2:
该方法应该是可维护的,即不涉及与 Room 行为匹配的手写 SQL。理想情况下,应该有某种方法可以检索Room 生成的 SQL,或者SQLiteOpenHelper.onCreate()等效的方法。或任何其他解决此问题的方法!:)

4

6 回答 6

29

我发现通过 context.deleteDatabase(“name”) 最容易做到这一点,然后在第一次访问时通过 Room.databaseBuilder().addCallback 简单地重新实例化和重新填充数据库。

于 2018-10-22T22:34:44.183 回答
4

简单的答案是增加您的 @Database 版本号。一般来说,您应该为架构更改执行此操作,但是它将实现您清除数据库和重置所有主键值的目的。

@Database(entities = { Hello.class }}, version = 1) // <- you want to increase version by 1
@TypeConverters({})
public abstract class AppDatabase extends RoomDatabase {
    public abstract HelloDao helloTextDao();
}

编辑:如果您想在运行时执行此操作,我会从您的表中清除所有数据(以避免 FK 问题),然后DROP TABLE table_name在您各自的所有表上调用。然后,您将需要编写查询来创建表,即:CREATE TABLE table_name (uid INTEGER PRIMARY KEY, name STRING);

不幸的是,这意味着您必须维护一个与您的 POJO 保持同步的创建表查询列表。理想情况下,您可以使用反射来生成查询,但是 @ColumnInfo 目前不支持反射,因为它RetentionPolicy设置为CLASS.

希望这可以解决您的问题,请随时在评论中要求进一步澄清。狩猎愉快!

于 2017-07-03T15:36:19.373 回答
2

这可能会对您有所帮助。

  1. 升级您的数据库版本

  2. 当您调用 DatabaseBuilder 时,请记住将其添加到您的代码中fallbackToDestructiveMigration

    Room.databaseBuilder(context, Database::class.java, DB_NAME) .allowMainThreadQueries() .fallbackToDestructiveMigration() .build()

更多细节请参考这里

于 2020-08-10T11:19:55.597 回答
2

就我而言,删除数据库context.deleteDatabase(“name”)仍​​然会缓存旧数据库的数据。

我通过手动删除数据库文件解决了这个问题

File databasesDir = new File(context.getApplicationInfo().dataDir + "/databases");
new File(databasesDir, "MyDatabaseName.db").delete();
于 2020-09-02T21:31:08.673 回答
2

我无法找到以编程方式执行此操作的方法。

但是,你可以去 yourApp -> Long click -> App Info -> Storage & Cache -> clear both cache and Storage。

清除存储会显示一个验证对话框,指示数据库将被销毁。

于 2021-08-01T17:40:08.487 回答
-4

根据这里这里这里给出的答案,我可以这样做:

public void deleteAndReset() {
    SQLiteDatabase database;
    database = SQLiteDatabase.openOrCreateDatabase(context.getDatabasePath(MY_DATABASE_NAME), null);
    String deleteTable = "DELETE FROM " + MY_TABLE_NAME;
    database.execSQL(deleteTable);
    String deleteSqliteSequence = "DELETE FROM sqlite_sequence WHERE name = '" + MY_TABLE_NAME + "'";
    database.execSQL(deleteSqliteSequence);
}
于 2019-08-09T15:12:50.387 回答