web-dev-qa-db-ja.com

部屋永続ライブラリすべて削除

Room Persistence Libraryを使用して特定のテーブルの全エントリを削除する方法を教えてください。テーブルを削除する必要がありますが、これを行う方法についての情報を見つけることができません。

データベースが移行中の場合、またはすべてのエントリをロードして削除する場合のみ。

120
Sirelon

これを行うためにDAOメソッドを作成することができます。

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

Room 1.1.0では、 clearAllTables() whichを使用できます。

このデータベースにentities()として登録されている全てのテーブルから全ての行を削除します。

65
Dick Lucas

Roomのテーブルからエントリを削除したい場合は、この関数を呼び出してください。

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

更新: そしてあなたが完全なテーブルを削除したい場合は、以下の関数を呼び出してください、

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

注: ここに MyModel はテーブル名です。

16

Java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.を避けるために、以下のように clearAllTables() をRXJavaと共に使用してください。

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


                }
            });
5
Adewale Balogun

何を 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()
        }
    }
1
Hamlet Leon

バックグラウンドでこのタスクを実行するために RxJava を使用するときに、delete allメソッドで問題がありました。これが私がついにそれを解決した方法です:

@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)
}
1
Micer

@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);
0
Dirk Fraanje