Sir*_*lon 156 android android-room android-architecture-components
如何使用Room Persistence Library删除特定表上的所有条目?我需要删除表,但我无法找到任何信息如何执行此操作.
仅在数据库迁移或加载所有条目并删除它们时:)
yig*_*git 378
您可以创建一个DAO方法来执行此操作.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
Run Code Online (Sandbox Code Playgroud)
Dic*_*cas 81
从Room开始,1.1.0你可以使用clearAllTables():
从作为entities()注册到此数据库的所有表中删除所有行.
Ama*_*TeR 22
如果要从Room中的表中删除条目,只需调用此函数,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Run Code Online (Sandbox Code Playgroud)
更新:如果你想删除完整的表,请调用以下函数,
@Query("DELETE FROM MyModel")
void delete();
Run Code Online (Sandbox Code Playgroud)
注意:这里MyModel是表名.
小智 8
如下所示,将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());
}
});
Run Code Online (Sandbox Code Playgroud)
使用RxJava在后台执行此任务时,我遇到了 delete all 方法的问题。这就是我最终解决它的方法:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
Run Code Online (Sandbox Code Playgroud)
和
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
Run Code Online (Sandbox Code Playgroud)
这就是我们如何从片段中做到这一点。
fun Fragment.emptyDatabase() {
viewLifecycleOwner.lifecycleScope.launchWhenCreated {
withContext(Dispatchers.IO) {
Database.getInstance(requireActivity()).clearAllTables()
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您要从活动中清空数据库,请使用以下命令:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
也可以clearAllTables从主线程调用该方法。我还没有尝试过,但我注意到 Android Studio 无法将调用识别为挂起函数。