programing

객실 유지 라이브러리.모두삭제

subpage 2023. 10. 11. 20:43
반응형

객실 유지 라이브러리.모두삭제

룸 지속성 라이브러리를 사용하여 특정 테이블의 모든 항목을 삭제하려면 어떻게 해야 합니까?테이블을 떨어뜨려야 하는데 어떻게 해야 하는지 정보를 찾을 수가 없습니다.

데이터베이스가 마이그레이션 중이거나 모든 항목을 로드한 후 삭제하는 경우에만 :)

이를 위해 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()
    }
}

제가 코틀린에서 한 방법은 이렇습니다.

  1. DI(Koin)을 이용하여 활동 중에 room db를 주입합니다.

     private val appDB: AppDB by inject()
    
  2. 그러면 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

반응형