如何使用Room Persistence Library删除特定表上的所有条目? 我需要删除表,但是我找不到任何关于如何做到这一点的信息。
只有在数据库迁移或加载所有条目并删除它们时才能实现 :)
如何使用Room Persistence Library删除特定表上的所有条目? 我需要删除表,但是我找不到任何关于如何做到这一点的信息。
只有在数据库迁移或加载所有条目并删除它们时才能实现 :)
你可以创建一个DAO方法来实现这个功能。
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
只适用于返回结果集的事物(类似于rawQuery()
)。非常棒! - CommonsWare@Delete
不带参数并从表中删除所有内容吗?我正在尝试查找Room的跟踪器以进行存档... - Felipe DuarteIds
怎么样?我这样做了,但是表 Ids
继续递增。在真实的表中,Ids
也会被删除以重新从 0 开始。 - Ioane Sharvadze从版本1.1.0
开始,你可以使用clearAllTables()方法来做到以下操作:
删除所有在此数据库中作为entities()注册的表中的所有行。
clearAllTables()
不是异步操作,但它强制你不要从主线程调用它。 - Demigod如果想要从Room中的表中删除一个条目,只需调用此函数:
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
更新:如果您想删除整个表,请调用以下函数:
@Query("DELETE FROM MyModel")
void delete();
注意:这里的MyModel是一个表名。
使用下面类似的RXJava代码和clearAllTables()来避免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。 - Erik以下是从碎片(Fragment)中执行的方法。
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不会将此调用识别为暂停函数。
结合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()
}
}
@Query
注释的情况下使用 Room,首先使用@Query
选择所有行并将它们放入列表中,例如:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
Inject room db in the activity using DI (Koin).
private val appDB: AppDB by inject()
Then you can simply call 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)
}
}
clearAllTables()
方法,它会“删除所有被注册为实体的表中的所有行”。我已经在下面的答案中包含了这个信息,但为了更加明确,我在此重复一遍。 - Dick LucasclearAllTables()
,我忍不住要指出OP非常清楚地说:“如何删除特定表格中的所有条目”。 - Chucky