Room Persistence Libraryを使用して特定のテーブルの全エントリを削除する方法を教えてください。テーブルを削除する必要がありますが、これを行う方法についての情報を見つけることができません。
データベースが移行中の場合、またはすべてのエントリをロードして削除する場合のみ。
これを行うためにDAOメソッドを作成することができます。
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
Room 1.1.0
では、 clearAllTables() whichを使用できます。
このデータベースにentities()として登録されている全てのテーブルから全ての行を削除します。
Roomのテーブルからエントリを削除したい場合は、この関数を呼び出してください。
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
更新: そしてあなたが完全なテーブルを削除したい場合は、以下の関数を呼び出してください、
@Query("DELETE FROM MyModel")
void delete();
注: ここに MyModel はテーブル名です。
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());
}
});
何を 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()
}
}
バックグラウンドでこのタスクを実行するために 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)
}
@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);