ห้องสมุดห้องติดตา ลบทั้งหมด


182

ฉันจะลบรายการทั้งหมดบนตารางที่ระบุโดยใช้ห้องสมุดการคงอยู่ของห้องได้อย่างไร ฉันต้องการวางตาราง แต่ไม่สามารถหาข้อมูลใด ๆ ได้

เมื่อฐานข้อมูลกำลังโยกย้ายหรือโหลดรายการทั้งหมดและลบออก :)


14
ในห้อง 1.1.0 คุณสามารถใช้clearAllTables()ที่ "ลบแถวทั้งหมดออกจากตารางทั้งหมดที่ลงทะเบียนในฐานข้อมูลนี้เป็นเอนทิตี ()" ฉันได้รวมสิ่งนี้ไว้เป็นคำตอบด้านล่าง แต่กำลังทำซ้ำเพื่อให้มองเห็นได้ที่นี่
Dick Lucas

คำตอบ:


446

คุณสามารถสร้างวิธี DAO เพื่อทำสิ่งนี้

@Dao 
interface MyDao {
    @Query("DELETE FROM myTableName")
    public void nukeTable();
}

3
อาฉันไม่ได้คิดอย่างนั้น ฉันคิดว่าสิ่ง@Queryนั้น จำกัด เฉพาะสิ่งที่ส่งคืนผลลัพธ์ (คล้ายกับrawQuery()) เจ๋งมาก!
CommonsWare

1
@yigit ฉันสามารถขอให้@Deleteไม่มีพารามิเตอร์และลบทั้งหมดออกจากตารางได้หรือไม่ ฉันพยายามค้นหาตัวติดตามของ Room เพื่อบันทึกไฟล์นั้น ...
Felipe Duarte

4
ระวัง! สำหรับห้องอัลฟารุ่นที่ 4 เทคนิคนี้จะนำไปสู่การสร้างการไล่ระดับสีล้มเหลว: issuetracker.google.com/issues/63608092
yshahak

2
แล้วไงIdsล่ะ ฉันทำเช่นนี้ แต่รหัสตารางเพิ่มขึ้นเรื่อย ๆ ในตารางการวางตารางรหัสจริงจะถูกลดลงเพื่อเริ่มจาก 0 อีกครั้ง
Ioane Sharvadze

6
@yigit มีวิธีการตรวจสอบว่าแบบสอบถามประสบความสำเร็จหรือมีข้อผิดพลาดหรือไม่?
Aditya Ladwa

107

ในฐานะของห้อง1.1.0คุณสามารถใช้clearAllTables ()ซึ่ง:

ลบแถวทั้งหมดออกจากตารางทั้งหมดที่ลงทะเบียนในฐานข้อมูลนี้เป็นเอนทิตี ()


44
ระวัง: clearAllTables () เป็นแบบอะซิงโครนัสและไม่มีทางที่จะบอกได้ว่ามันจะเสร็จสมบูรณ์เมื่อใด
Alexey

2
@Alexey แต่อาจมีปัญหาในการพยายามบันทึกบางอย่างหลังจาก clearAllTables หรือไม่ เช่นเดียวกับในมันจะพยายามแทรกการล้างหลังจากหรือไม่ เพราะฉันสบายดี
FirstOne

2
@FirstOne clearAllTables โดยทั่วไปเพิ่งเริ่มทำธุรกรรมบนเธรดพื้นหลังใหม่ มันจะลบข้อมูลทั้งหมดจากตารางและจากนั้นทำธุรกรรมนั้น หากคุณเริ่มต้นการทำธุรกรรมช้ากว่า clearTables เริ่มต้นคุณก็สบายดี ที่ถูกกล่าวว่าหากคุณพยายามแทรกข้อมูลบางอย่างหลังจากโทร clearAllTable การแทรกของคุณอาจเริ่มต้นก่อนที่ clearAllTable จะเริ่มทำธุรกรรมและคุณจะสูญเสียข้อมูลทั้งหมดของคุณ หากคุณต้องการแทรกข้อมูลใหม่ทันทีหลังจากโทร clearAllTable อย่างน้อยก็เพิ่มความล่าช้า
Alexey

2
@Alexey มีวิธีการใช้วิธีการโทรกลับหรือคล้ายกันเพื่อตรวจสอบสถานะของการทำธุรกรรมการลบหรือไม่? กล่าวอีกนัยหนึ่งถ้าสถานะการลบธุรกรรมเสร็จสมบูรณ์แล้วให้ดำเนินการตามวิธีการแทรกข้อมูล
AJW

1
@AJW ไม่ ณ ตอนนี้ยังไม่มีวิธีที่จะบอกเมื่อการดำเนินการเสร็จสมบูรณ์ หากคุณต้องการฟังก์ชั่นนี้จริงๆคุณอาจต้องการที่จะลองสิ่งที่ชอบแล้วด้วยตนเองSELECT name FROM sqlite_master WHERE type='table' DELETE FROM {TABLE}ยังไม่ได้ทดสอบสิ่งนี้
Alexey

33

หากต้องการลบรายการจากตารางในห้องเพียงเรียกใช้ฟังก์ชันนี้

@Dao
public interface myDao{
    @Delete
    void delete(MyModel model);
}

อัปเดต:และหากคุณต้องการลบตารางที่สมบูรณ์ให้โทรฟังก์ชั่นด้านล่าง

  @Query("DELETE FROM MyModel")
  void delete();

หมายเหตุ: ที่นี่MyModelเป็นชื่อตาราง


ฉันได้รับข้อผิดพลาดนี้หลังจากใช้ข้อผิดพลาดของรหัสอัปเดตของคุณ: วิธีการ DAO แบบนามธรรมต้องได้รับการเพิ่มความคิดเห็นด้วยหมายเหตุประกอบอย่างใดอย่างหนึ่งต่อไปนี้เท่านั้น: ใส่, ลบ, แบบสอบถาม, อัปเดต, โมฆะ RawQuery เป็นโมฆะ
bramastaVic

12

ใช้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());


                }
            });

4

ฉันมีปัญหากับการลบเมธอดทั้งหมดเมื่อใช้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)
}

5
เมื่อคุณใช้ Kotlin คุณสามารถห่อมันthread {}แทน Futzing ด้วย RxJava
Erik

1

เมื่อรวมสิ่งที่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()
        }
    }

สำหรับสิ่งที่คุ้มค่าฉันพบว่าทำได้ง่ายที่สุดผ่านทาง context.deleteDatabase (“ ชื่อ”) จากนั้นทำการรวบรวมและจัดทำฐานข้อมูลใหม่ผ่าน Room.databaseBuilder (). addCallback เมื่อเข้าถึงครั้งแรก
Bink

sqlite_sequence คืออะไร
RoyalGriffin

0

ในการใช้ประโยชน์จากห้องโดยไม่ใช้@Queryคำอธิบายประกอบในทางที่ผิดก่อนอื่น@Queryให้ใช้เพื่อเลือกแถวทั้งหมดและวางไว้ในรายการเช่น:

@Query("SELECT * FROM your_class_table")

List`<`your_class`>` load_all_your_class();

ใส่รายการของเขาในหมายเหตุประกอบการลบเช่น:

@Delete

void deleteAllOfYourTable(List`<`your_class`>` your_class_list);

0

นี่คือวิธีที่ฉันได้ทำใน Kotlin

  1. Inject room db ในกิจกรรมโดยใช้ DI (Koin)

     private val appDB: AppDB by inject()
  2. จากนั้นคุณสามารถโทร clearAllTables ()

    ความสนุกสนานส่วนตัว clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, false) preferences.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, false)}}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.