ฉันจะลบรายการทั้งหมดบนตารางที่ระบุโดยใช้ห้องสมุดการคงอยู่ของห้องได้อย่างไร ฉันต้องการวางตาราง แต่ไม่สามารถหาข้อมูลใด ๆ ได้
เมื่อฐานข้อมูลกำลังโยกย้ายหรือโหลดรายการทั้งหมดและลบออก :)
ฉันจะลบรายการทั้งหมดบนตารางที่ระบุโดยใช้ห้องสมุดการคงอยู่ของห้องได้อย่างไร ฉันต้องการวางตาราง แต่ไม่สามารถหาข้อมูลใด ๆ ได้
เมื่อฐานข้อมูลกำลังโยกย้ายหรือโหลดรายการทั้งหมดและลบออก :)
คำตอบ:
คุณสามารถสร้างวิธี DAO เพื่อทำสิ่งนี้
@Dao
interface MyDao {
@Query("DELETE FROM myTableName")
public void nukeTable();
}
@Query
นั้น จำกัด เฉพาะสิ่งที่ส่งคืนผลลัพธ์ (คล้ายกับrawQuery()
) เจ๋งมาก!
@Delete
ไม่มีพารามิเตอร์และลบทั้งหมดออกจากตารางได้หรือไม่ ฉันพยายามค้นหาตัวติดตามของ Room เพื่อบันทึกไฟล์นั้น ...
Ids
ล่ะ ฉันทำเช่นนี้ แต่รหัสตารางเพิ่มขึ้นเรื่อย ๆ ในตารางการวางตารางรหัสจริงจะถูกลดลงเพื่อเริ่มจาก 0 อีกครั้ง
ในฐานะของห้อง1.1.0
คุณสามารถใช้clearAllTables ()ซึ่ง:
ลบแถวทั้งหมดออกจากตารางทั้งหมดที่ลงทะเบียนในฐานข้อมูลนี้เป็นเอนทิตี ()
SELECT name FROM sqlite_master WHERE type='table'
DELETE FROM {TABLE}
ยังไม่ได้ทดสอบสิ่งนี้
หากต้องการลบรายการจากตารางในห้องเพียงเรียกใช้ฟังก์ชันนี้
@Dao
public interface myDao{
@Delete
void delete(MyModel model);
}
อัปเดต:และหากคุณต้องการลบตารางที่สมบูรณ์ให้โทรฟังก์ชั่นด้านล่าง
@Query("DELETE FROM MyModel")
void delete();
หมายเหตุ: ที่นี่MyModelเป็นชื่อตาราง
ใช้clearAllTables ()กับ RXJava ด้านล่างเพื่อหลีกเลี่ยง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 {}
แทน Futzing ด้วย 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()
}
}
ในการใช้ประโยชน์จากห้องโดยไม่ใช้@Query
คำอธิบายประกอบในทางที่ผิดก่อนอื่น@Query
ให้ใช้เพื่อเลือกแถวทั้งหมดและวางไว้ในรายการเช่น:
@Query("SELECT * FROM your_class_table")
List`<`your_class`>` load_all_your_class();
ใส่รายการของเขาในหมายเหตุประกอบการลบเช่น:
@Delete
void deleteAllOfYourTable(List`<`your_class`>` your_class_list);
นี่คือวิธีที่ฉันได้ทำใน Kotlin
Inject room db ในกิจกรรมโดยใช้ DI (Koin)
private val appDB: AppDB by inject()
จากนั้นคุณสามารถโทร clearAllTables ()
ความสนุกสนานส่วนตัว clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) preferences.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)}}
clearAllTables()
ที่ "ลบแถวทั้งหมดออกจากตารางทั้งหมดที่ลงทะเบียนในฐานข้อมูลนี้เป็นเอนทิตี ()" ฉันได้รวมสิ่งนี้ไว้เป็นคำตอบด้านล่าง แต่กำลังทำซ้ำเพื่อให้มองเห็นได้ที่นี่