房间持久性库。全部删除

问题描述 投票:0回答:9

如何使用房间持久性库删除特定表上的所有条目? 我需要删除表,但我找不到任何信息如何执行此操作。

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

android android-room android-architecture-components
9个回答
625
投票

您可以创建一个 DAO 方法来执行此操作。

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

146
投票

从 Room

1.1.0
开始,您可以使用 clearAllTables() 其中:

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


44
投票

如果您想从 Room 的表中删除条目,请调用此函数:

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

如果要删除整个表,请调用此函数:

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

这里,

MyModel
是表名。


15
投票

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());


                }
            });

10
投票

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

9
投票

这就是我们从 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 无法将调用识别为挂起函数。


4
投票

结合 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()
    }
}

2
投票

要在不滥用

@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);

2
投票

这是我在 Kotlin 中的做法。

  1. 使用 DI (Koin) 在活动中注入 room 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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.