回答:
これを行うためのDAOメソッドを作成できます。
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
が結果セットを返すものに限定されていると思いました(に似ていますrawQuery()
)。とてもかっこいい!
@Delete
は、パラメーターを使用せずにテーブルからすべて削除するように要求できますか?私はそれを提出するために部屋のトラッカーを見つけようとしています...
Ids
ですか?私はこれが好きでしたが、テーブルIDは増え続けています。実際のテーブルドロップでは、IDもドロップされ、0から再び開始されます。
Room以降1.1.0
では、clearAllTables()を使用して次のことができます。
このデータベースにentity()として登録されているすべてのテーブルからすべての行を削除します。
SELECT name FROM sqlite_master WHERE type='table'
から手動で試してくださいDELETE FROM {TABLE}
。これはまだテストしていません。
ルームのテーブルからエントリを削除する場合は、この関数を呼び出すだけです。
@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を使用してこのタスクをバックグラウンドで実行すると、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)
}
thread {}
、RxJavaを使用する代わりにラップするだけです
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()
}
}
ここに私がコトリンでそれをした方法があります。
DI(Koin)を使用して、ルームdbをアクティビティに注入します。
private val appDB: AppDB by inject()
次に、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()
以降では、「entities()としてこのデータベースに登録されているすべてのテーブルからすべての行を削除する」を使用できます。これを以下の回答として含めましたが、見やすくするためにここで再現しています。