कक्ष दृढ़ता पुस्तकालय। सभी हटा दो


182

मैं रूम पर्सिस्टेंस लाइब्रेरी का उपयोग करके विशिष्ट टेबल पर सभी प्रविष्टियों को कैसे हटा सकता हूं? मुझे टेबल छोड़ने की आवश्यकता है, लेकिन मुझे यह कैसे करना है, इसके बारे में कोई जानकारी नहीं मिल सकती है।

केवल जब डेटाबेस माइग्रेट हो रहा है या सभी प्रविष्टियों को लोड करने और उन्हें हटाने के लिए :)


14
कक्ष 1.1.0 के रूप में आप उपयोग कर सकते हैं clearAllTables()जो "सभी डेटाबेस से सभी पंक्तियों को हटाता है जो इस डेटाबेस में संस्थाओं () के रूप में पंजीकृत हैं।" मैंने इसे नीचे दिए गए उत्तर के रूप में शामिल किया है, लेकिन दृश्यता के लिए यहां पुन: प्रस्तुत कर रहा हूं।
डिक लुकास

जवाबों:


446

ऐसा करने के लिए आप DAO विधि बना सकते हैं।

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

3
आह, मैंने ऐसा नहीं सोचा था। मैंने मान लिया @Queryथा कि परिणाम सेट (एंकिन rawQuery()) पर लौटने वाली चीजों तक सीमित था । बहुत ही शांत!
कॉमन्सवेयर

1
@ क्या मैं अनुरोध कर सकता हूं कि @Deleteकोई पैरामीटर नहीं है और तालिका से सभी को हटा दें? मैं कमरे के ट्रैकर को खोजने की कोशिश कर रहा हूं कि ...
फेलिप ड्यूर्ट

4
ध्यान रहे! : कक्ष alpha4 संस्करण के लिए के रूप में, इस तकनीक से असफल हो सकता Gradle निर्माण को बढ़ावा मिलेगा issuetracker.google.com/issues/63608092
yshahak

2
कैसे के बारे में Ids? मुझे यह पसंद आया लेकिन टेबल आईड्स में वृद्धि जारी है। असली टेबल ड्रॉप में Ids को फिर से 0 से शुरू करने के लिए भी गिराया जाता है।
इयाने शरवाद्ज़े

6
@yigit यह पता लगाने का एक तरीका है कि क्या क्वेरी सफलतापूर्वक चली या यदि कोई त्रुटि थी?
आदित्य लाडवा

107

कमरे के रूप में 1.1.0आप clearAllTables () का उपयोग कर सकते हैं :

सभी डेटाबेस से सभी पंक्तियों को हटाता है जो इस डेटाबेस में संस्थाओं () के रूप में पंजीकृत हैं।


44
सावधान रहें: ClearAllTables () अतुल्यकालिक है और यह पूरा होने पर बताने का कोई तरीका नहीं है।
एलेक्सी

2
@Alexey लेकिन ClearAllTables के बाद कुछ बचाने की कोशिश करने में कोई परेशानी हो सकती है? जैसा कि, यह केवल AFTER क्लियरिंग डालने का प्रयास करेगा? क्योंकि मैं उसके साथ ठीक हूं।
FirstOne

2
@FirstOne clearAllTables मूल रूप से एक नए पृष्ठभूमि थ्रेड पर केवल एक लेनदेन शुरू करता है। यह तालिकाओं से सभी डेटा को हटाता है और फिर उस लेनदेन को करता है। यदि आप अपना लेन-देन बाद में शुरू करते हैं तो ClearAllTables इसकी शुरुआत करता है, तो आप ठीक हैं। कहा जा रहा है, यदि आप क्लियर कॉल करने के बाद कुछ डेटा सही डालने का प्रयास करते हैं, तो आपका इंसट्रक्शन क्लियर शुरू होने से पहले आपका इंसट्रक्शन शुरू हो सकता है और आप अपना सारा डेटा ढीला कर देंगे। यदि आपको क्लियर कॉल करने के बाद नया डेटा डालने की आवश्यकता है, तो कम से कम कुछ विलंब जोड़ें।
एलेक्सी

2
@Alexey कॉलबैक विधि का उपयोग करने का कोई तरीका है या डिलीट लेनदेन की स्थिति का निर्धारण करने के लिए समान है? दूसरे शब्दों में, यदि डिलीट ट्रांजैक्शन स्टेट पूरा हो गया है, तो इंसर्ट डेटा विधि से आगे बढ़ें।
AJW

1
@AJW नहीं, अभी तक, ऑपरेशन पूरा होने पर बताने का कोई तरीका नहीं है। यदि आपको वास्तव में इस कार्यक्षमता की आवश्यकता है, तो आप कुछ SELECT name FROM sqlite_master WHERE type='table'और फिर मैन्युअल रूप से आज़माना चाहेंगे DELETE FROM {TABLE}। हालांकि यह परीक्षण नहीं किया गया है।
एलेक्सी

33

यदि कमरे में टेबल से एक प्रविष्टि हटाना चाहते हैं, तो बस इस फ़ंक्शन को कॉल करें,

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

अद्यतन: और यदि आप पूरी तालिका को हटाना चाहते हैं, तो नीचे दिए गए कार्य को कॉल करें,

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

नोट: यहां MyModel एक टेबल नेम है।


मुझे यह त्रुटि आपके अपडेट कोड त्रुटि का उपयोग करने के बाद मिली: एक सार DAO विधि को एनोटेशन में से एक और केवल एक एनोटेशन के साथ होना चाहिए: इन्सर्ट, डिलीट, क्वेरी, अपडेट, रॉविओइड शून्य हटाना ();
ब्रम्हस्तिक

12

बचने के लिए नीचे दिए गए इनवर्टर जैसे 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());


                }
            });

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
जब आप कोटलिन का उपयोग कर रहे हैं, तो आप इसे thread {}RxJava
Erik

1

डिक लुकास का कहना है कि संयोजन और अन्य StackOverFlow पदों से एक रीसेट autoincremental जोड़ने, मुझे लगता है कि आप यह कर सकते हैं:

    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()
        }
    }

इसके लायक क्या है, मैंने इसे संदर्भ के माध्यम से करना सबसे आसान पाया है ।deleteDatabase ("name") और उसके बाद केवल Room.databaseBuilder () के माध्यम से डेटाबेस को फिर से स्थापित करना और पुन: उपयोग करना। पहली पहुंच के लिए .Callback।
Bink

Sqlite_fterence क्या है?
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

यहाँ मैंने इसे कोटलिन में कैसे किया है।

  1. डीआई (कोइन) का उपयोग करते हुए गतिविधि में इंजेक्ट रूम डीबी।

     private val appDB: AppDB by inject()
  2. तो आप बस clearAllTables () कॉल कर सकते हैं

    निजी मज़ेदार clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () प्राथमिकताएँ .put (वरीयताप्राप्तकर्ता (IISCUPADCATEGORIES_SAVED_TO_DB), झूठी) प्राथमिकताएँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.