Answers:
您可以创建一个DAO方法来执行此操作。
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
限于返回结果集的内容(类似于rawQuery()
)。很酷!
@Delete
不带参数并从表中删除所有参数吗?我正在尝试查找Room的跟踪器来归档该文件…
Ids
样 我确实喜欢这样,但是表ID继续增加。在实际表删除中,Id也会再次从0开始删除。
从Room开始,1.1.0
您可以使用clearAllTables():
从所有以entities()形式注册到此数据库的表中删除所有行。
SELECT name FROM sqlite_master WHERE type='table'
,然后手动进行DELETE FROM {TABLE}
。尚未测试过。
如果要从“房间”表中删除条目,只需调用此函数,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
更新:如果您要删除完整表格,请调用以下函数,
@Query("DELETE FROM MyModel")
void delete();
注:这里为MyModel是一个表名。
像下面这样将clearAllTables()与RXJava一起使用以避免java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
getRoomDatabase().clearAllTables();
}
}).subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe(new Action() {
@Override
public void run() throws Exception {
Log.d(TAG, "--- clearAllTables(): run() ---");
getInteractor().setUserAsLoggedOut();
getMvpView().openLoginActivity();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.d(TAG, "--- clearAllTables(): accept(Throwable throwable) ----");
Log.d(TAG, "throwable.getMessage(): "+throwable.getMessage());
}
});
使用RxJava在后台执行此任务时,我在删除所有方法时遇到问题。这是我终于解决的方法:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
和
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}
而不必使用RxJava进行融合
结合Dick Lucas所说的,并从其他StackOverFlow帖子中添加一个重置自动增量功能,我认为这可以工作:
fun clearAndResetAllTables(): Boolean {
val db = db ?: return false
// reset all auto-incrementalValues
val query = SimpleSQLiteQuery("DELETE FROM sqlite_sequence")
db.beginTransaction()
return try {
db.clearAllTables()
db.query(query)
db.setTransactionSuccessful()
true
} catch (e: Exception){
false
} finally {
db.endTransaction()
}
}
这就是我在科特林所做的工作。
使用DI(Koin)在活动中注入房间db。
private val appDB: AppDB by inject()
然后,您可以简单地调用clearAllTables()
私人乐趣clearRoomDB(){GlobalScope.launch {appDB.clearAllTables()preferences.put(PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB,false)preferences.put(PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB,false)}}
clearAllTables()
“从作为entry()注册到此数据库的所有表中删除所有行”。我已经在下面将其作为答案,但此处出于可见性而复制。