如何在Android Room中完全重新创建数据库?

时间:2017-06-28 18:48:30

标签: android-room

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

我知道我可以访问SupportSQLiteOpenHelper通过房间并自行删除所有表格,但似乎没有一个好方法来启动娱乐过程。

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

谢谢!

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

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

6 个答案:

答案 0 :(得分:4)

我发现最简单的方法是通过context.deleteDatabase(“ name”),然后在首次访问时通过Room.databaseBuilder()。addCallback重新实例化并重新填充数据库。

答案 1 :(得分:2)

简单的答案是增加@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

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

答案 2 :(得分:0)

这可能会对您有所帮助。

  1. 升级数据库版本

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

    Room.databaseBuilder(上下文,数据库:: class.java,DB_NAME) .allowMainThreadQueries() .fallbackToDestructiveMigration() .build()

更多详细信息,请参阅this

答案 3 :(得分:0)

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

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

File databasesDir = new File(context.getApplicationInfo().dataDir + "/databases");
new File(databasesDir, "MyDatabaseName.db").delete();

答案 4 :(得分:0)

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

但是,您可以转到 yourApp -> Long click -> App Info -> Storage & Cache -> 清除缓存和 Storage。

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

答案 5 :(得分:-1)

根据hereherehere给出的答案,我可以按照以下步骤进行操作:

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);
}