객실 유지 라이브러리.모두삭제
룸 지속성 라이브러리를 사용하여 특정 테이블의 모든 항목을 삭제하려면 어떻게 해야 합니까?테이블을 떨어뜨려야 하는데 어떻게 해야 하는지 정보를 찾을 수가 없습니다.
데이터베이스가 마이그레이션 중이거나 모든 항목을 로드한 후 삭제하는 경우에만 :)
이를 위해 DAO 메서드를 만들 수 있습니다.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
방 기준1.1.0다음 중에서 clearAllTables()를 사용할 수 있습니다.
이 데이터베이스에 엔티티()로 등록된 모든 테이블에서 모든 행을 삭제합니다.
룸의 테이블에서 항목을 삭제하려면 이 함수를 호출하면 됩니다.
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
업데이트: 그리고 완전한 테이블을 삭제하고 싶다면 아래 기능으로 전화를 걸어보세요.
@Query("DELETE FROM MyModel")
void delete();
참고: 여기 내 모델은 테이블 이름입니다.
아래와 같이 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)
}
프래그먼트에서 이렇게 하는 겁니다.
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()
}
}
전화를 하는 것도 가능할 것입니다.clearAllTablesmethod from the main thread.사용해 본 적은 없지만 안드로이드 스튜디오에서 통화를 일시 중단 기능으로 인식하지 못하는 것을 발견했습니다.
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)을 이용하여 활동 중에 room 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)
}
}
방을 남용하지 않고 사용하는 것.@Query주석 첫 번째 사용@Query다음과 같이 모든 행을 선택하고 목록에 넣습니다.
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
다음과 같이 목록을 삭제 주석에 넣습니다.
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
언급URL : https://stackoverflow.com/questions/44244508/room-persistance-library-delete-all
'programing' 카테고리의 다른 글
| Angularjs를 사용하여 선택 드롭다운에서 기본값 설정 (0) | 2023.10.11 |
|---|---|
| varchar 대신 varchar가 아닌 varvinary인 이유 (0) | 2023.10.11 |
| Oracle에서 ID 열을 재설정하는 방법 (0) | 2023.10.11 |
| 동일한 테이블의 열에 외래 키 제약 조건 적용 (0) | 2023.10.11 |
| 번역 문자열을 각번역으로 가장 잘 구성하는 방법은? (0) | 2023.10.11 |