Câu trả lời:
Bạn có thể tạo một phương thức DAO để làm điều này.
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
bị giới hạn ở những thứ trả về tập kết quả (gần giống rawQuery()
). Rất tuyệt!
@Delete
không có tham số và xóa tất cả khỏi bảng không? Tôi đang cố gắng tìm trình theo dõi của Room để gửi ...
Ids
? Tôi đã làm như vậy nhưng Id bảng tiếp tục tăng. Trong bảng thực tế, Id cũng được thả để bắt đầu lại từ 0.
Kể từ Room, 1.1.0
bạn có thể sử dụng ClearAllTables () trong đó:
Xóa tất cả các hàng khỏi tất cả các bảng được đăng ký vào cơ sở dữ liệu này dưới dạng các thực thể ().
SELECT name FROM sqlite_master WHERE type='table'
và sau đó bằng tay DELETE FROM {TABLE}
. Không thử nghiệm điều này mặc dù.
Nếu muốn xóa một mục từ bảng trong Phòng, chỉ cần gọi chức năng này,
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
Cập nhật: Và nếu bạn muốn xóa bảng hoàn chỉnh, hãy gọi hàm dưới đây,
@Query("DELETE FROM MyModel")
void delete();
Lưu ý: Ở đây MyModel là Tên bảng.
Sử dụng ClearAllTables () với RXJava như bên dưới inorder để tránhjava.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());
}
});
Tôi gặp vấn đề với việc xóa tất cả phương thức khi sử dụng RxJava để thực thi tác vụ này trên nền. Đây là cách cuối cùng tôi đã giải quyết nó:
@Dao
interface UserDao {
@Query("DELETE FROM User")
fun deleteAll()
}
và
fun deleteAllUsers() {
return Maybe.fromAction(userDao::deleteAll)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
d("database rows cleared: $it")
}, {
e(it)
}).addTo(compositeDisposable)
}
thread {}
thay vì đóng gói với RxJava
Kết hợp những gì Dick Lucas nói và thêm tự động thiết lập lại từ các bài đăng StackOverFlow khác, tôi nghĩ rằng điều này có thể hoạt động:
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()
}
}
Để sử dụng Phòng mà không lạm dụng @Query
chú thích, trước tiên, sử dụng @Query
để chọn tất cả các hàng và đưa chúng vào danh sách, ví dụ:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
Đặt danh sách của anh ấy vào chú thích xóa, ví dụ:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
Đây là cách tôi đã thực hiện nó trong Kotlin.
Tiêm db phòng trong hoạt động bằng DI (Koin).
private val appDB: AppDB by inject()
Sau đó, bạn có thể chỉ cần gọi ClearAllTables ()
riêng tư vui vẻ ClearRoomDB () {GlobalScope.launch {appDB.clear ALLTables () Preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) Preferences.put (PreferenceConstants.IS_MEMBERHAND
clearAllTables()
"xóa tất cả các hàng khỏi tất cả các bảng được đăng ký vào cơ sở dữ liệu này dưới dạng thực thể ()." Tôi đã bao gồm điều này như một câu trả lời dưới đây, nhưng đang tái tạo ở đây để nhìn thấy.