我有一种情况,我希望能够使用Android Room对我的数据库进行硬重置。使用SQLiteOpenHelper
,我可以通过编写一个方法来删除所有表和索引,然后手动调用SQLiteOpenHelper.onCreate()
。
我知道我可以访问SupportSQLiteOpenHelper
通过房间并自行删除所有表格,但似乎没有一个好方法来启动娱乐过程。
另外,我知道我可以删除每个表中的每个项目而不删除它,但这不是我想要的。这不会重置自动递增的主键,因此新项目的“id”字段不会重置为1.
谢谢!
编辑:
这是我希望能够在运行时任意做的事情。
编辑2:
该方法应该是可维护的,即不涉及手写符合Room行为的SQL。理想情况下,有一些方法可以检索 Room生成的SQL,或者SQLiteOpenHelper.onCreate()
等效方法。或其他任何解决这个问题的方法! :)
答案 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)
这可能会对您有所帮助。
升级数据库版本
调用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)
根据here,here和here给出的答案,我可以按照以下步骤进行操作:
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);
}