답변:
이를 위해 DAO 방법을 만들 수 있습니다.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
결과 집합을 반환하는 것 (akin to rawQuery()
) 으로 제한 되었다고 가정했습니다 . 아주 멋지다!
@Delete
매개 변수를 사용하지 않고 테이블에서 모두 삭제 하도록 요청할 수 있습니까? 방의 추적기를 찾으려고 노력하고 있습니다 ...
Ids
? 나는 이것을 좋아했지만 테이블 ID는 계속 증가합니다. 실제 테이블 삭제에서 ID도 0에서 다시 시작되도록 삭제됩니다.
Room 기준으로 clearAllTables () 를 1.1.0
사용할 수 있습니다 .
이 데이터베이스에 entity ()로 등록 된 모든 테이블에서 모든 행을 삭제합니다.
SELECT name FROM sqlite_master WHERE type='table'
수동으로 시도해 볼 수 있습니다 DELETE FROM {TABLE}
. 그래도 이것을 테스트하지 않았습니다.
Room의 테이블에서 항목을 삭제하려면 간단히이 함수를 호출하십시오.
@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 를 사용하여 백그라운드 에서이 작업을 실행할 때 모든 방법을 삭제하는 데 문제가있었습니다 . 이것이 내가 마침내 해결 한 방법입니다.
@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()
}
}
다음은 Kotlin에서 수행 한 방법입니다.
DI (코인)를 사용하여 활동에 방 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()
부터는 "이 데이터베이스에 엔티티 ()로 등록 된 모든 테이블에서 모든 행을 삭제합니다."를 사용할 수 있습니다 . 나는 이것을 아래 답변으로 포함했지만 가시성을 위해 여기에서 재현하고 있습니다.