房间持久化库。删除所有

如何使用房间持久性库删除特定表上的所有条目? 我需要删除表,但我找不到任何信息如何做到这一点

仅当数据库正在迁移或加载所有条目并删除它们:)

171801 次浏览

您可以创建一个DAO方法来做到这一点。

@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}

如果想要从Room中的表中删除一个条目,只需调用这个函数,

@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}

如果你想删除完整的表,调用下面的函数,

  @Query("DELETE FROM MyModel")
void delete();

这里MyModel是一个表名。

对于1.1.0房间,您可以使用clearAllTables (),其中:

删除作为entities()注册到此数据库的所有表中的所有行。

结合迪克·卢卡斯所说的,并从其他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()
}
}

使用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)
}

要在不滥用@Query注释的情况下使用Room,首先使用@Query选择所有行并将它们放入列表中,例如:

@Query("SELECT * FROM your_class_table")

List`<`your_class`>` load_all_your_class();

将他的列表放到delete注释中,例如:

@Delete

void deleteAllOfYourTable(List`<`your_class`>` your_class_list);

以下是我如何在Kotlin中做到这一点。

  1. 在活动中使用DI (Koin)注入房间db。

     private val appDB: AppDB by inject()
    
  2. 然后你可以简单地调用clearAllTables()

private fun clearRoomDB() {
GlobalScope.launch {
appDB.clearAllTables()
preferences.put(PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false)
preferences.put(PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)
}
}

这是我们如何从一个片段。

fun Fragment.emptyDatabase() {
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
withContext(Dispatchers.IO) {
Database.getInstance(requireActivity()).clearAllTables()
}
}
}


如果你正在从一个活动中清空数据库,请使用以下命令:

fun Activity.emptyDatabase() {
// create a scope to access the database from a thread other than the main thread
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
SitukaDatabase.getInstance(this@emptyDatabase).clearAllTables()
}
}

也可以从主线程调用clearAllTables方法。我还没有尝试过,但我注意到Android Studio不识别调用为挂起函数。

如果有人在寻找删除所有表,刷新应用程序中的所有内容,没有任何代码遵循
Device File Explorer -> data -> data -> com.YOUR_APP -> databases < br > 你可以删除databases文件夹

内的文件

如果你正在使用Rx,你可以这样做。

@Query("DELETE FROM yourDB")
void delete(); : Completable

在数据库实例上调用

clearAllTables ()