Oda kalıcılığı kütüphanesi. Hepsini sil


182

Oda Kalıcılığı Kitaplığı'nı kullanarak belirli bir tablodaki tüm girdileri nasıl silebilirim? Tablo bırakmam gerekiyor, ancak bunun nasıl yapılacağı hakkında herhangi bir bilgi bulamıyorum.

Yalnızca veritabanı taşınırken veya tüm girdileri yükleyip silerken :)


14
Oda 1.1.0'dan clearAllTables()itibaren hangi "varlıkların () olarak bu veritabanına kayıtlı tüm tablolardan tüm satırları siler" kullanabilirsiniz . Bunu aşağıda bir cevap olarak ekledim, ancak burada görünürlük için yeniden üretiyorum.
Dick Lucas

Yanıtlar:


446

Bunu yapmak için bir DAO yöntemi oluşturabilirsiniz.

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

3
Ah, bunu düşünmemiştim. Bunun @Querysonuç kümelerini döndüren şeylerle sınırlı olduğunu varsaydım (benzer rawQuery()). Çok havalı!
CommonsWare

1
@yigit @Deleteparametre almayan ve tümünü tablodan silebilir miyim? Bunu dosyalamak için
Felipe Duarte

4
Dikkat et! oda alpha4 sürümünde olduğu gibi, bu teknik bir gradle derlemesinin başarısız olmasına yol açacaktır: issuetracker.google.com/issues/63608092
yshahak

2
Nasıl Ids? Bunu beğendim ama Tablo Kimlikleri artmaya devam ediyor. Gerçek tablo düşüşünde ID'ler tekrar 0'dan başlamak üzere bırakılır.
Ioane Sharvadze

6
@yigit Sorgunun başarılı bir şekilde çalışıp çalışmadığını veya bir hata olup olmadığını öğrenmenin bir yolu var mı?
Aditya Ladwa

107

Oda olarak clearAllTables ()1.1.0 kullanabilirsiniz :

Bu veritabanına varlık () olarak kaydedilmiş tüm tablolardaki tüm satırları siler.


44
Dikkatli olun: clearAllTables () eşzamansızdır ve ne zaman tamamlandığını söylemenin bir yolu yoktur.
Alexey

2
@Alexey ama clearAllTables'dan sonra bir şeyi kaydetmeye çalışırken herhangi bir sorun olabilir mi? İçinde olduğu gibi, sadece temizleme SONRASI takmaya çalışır mı? Çünkü ben iyiyim.
2018

2
@FirstOne clearAllTables temel olarak yeni bir arka plan iş parçacığında bir işlem başlatır. Tablolardaki tüm verileri siler ve ardından bu işlemi gerçekleştirir. İşleminizi clearAllTables başladıktan sonra başlatırsanız, sorun değil. Bununla birlikte, clearAllTable'ı çağırdıktan hemen sonra bazı veriler eklemeye çalışırsanız, insert'iniz clearAllTable işlemi başlamadan önce başlayabilir ve tüm verilerinizi kaybedersiniz. ClearAllTable'ı çağırdıktan hemen sonra yeni veriler eklemeniz gerekiyorsa, en azından biraz gecikme ekleyin.
Alexey

2
@Alexey Silme işleminin durumunu belirlemek için geri arama yöntemi veya benzeri bir yöntem kullanmanın bir yolu var mı? Başka bir deyişle, işlem silme durumu tamamlanmışsa, veri ekleme yöntemiyle devam edin.
AJW

1
@AJW Hayır, şu andan itibaren, işlemin ne zaman tamamlandığını anlamanın bir yolu yok. Bu işlevselliğe gerçekten ihtiyacınız varsa, önce SELECT name FROM sqlite_master WHERE type='table've sonra manuel olarak bir şey denemek isteyebilirsiniz DELETE FROM {TABLE}. Yine de bunu test etmedim.
Alexey

33

Odadaki tablodan bir girişi silmek istiyorsanız, sadece bu işlevi çağırın,

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

Güncelleme: Tablonun tamamını silmek istiyorsanız aşağıdaki fonksiyonu çağırın,

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

Not: Burada MyModel bir Tablo Adıdır .


Güncelleme kodu hatanızı kullandıktan sonra bu hatayı aldım: Soyut bir DAO yöntemi aşağıdaki ek açıklamalardan biri ve yalnızca biri ile ek açıklanmalıdır: Ekle, Sil, Sorgu, Güncelleme, RawQuery void delete ();
bramastaVic

12

Önlemek için clearAllTables () öğesini aşağıdaki gibi RXJava ile kullanınjava.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

Bu görevi arka planda yürütmek için RxJava kullanırken tüm yöntemi silmek ile ilgili sorunlar vardı . Sonunda şu şekilde çözdüm:

@Dao
interface UserDao {
    @Query("DELETE FROM User")
    fun deleteAll()
}

ve

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 {}Kotlin'i kullanırken, RxJava ile fütür etmek yerine sadece sarın
Erik

1

Dick Lucas'ın söylediklerini birleştirerek ve diğer StackOverFlow yayınlarından bir sıfırlama otomatik eklemesi ekleyerek, bunun işe yarayabileceğini düşünüyorum:

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

Ne için değer, bunu yapmak için en kolay buldum context.deleteDatabase ("ad") ve sonra sadece yeniden erişim ve Room.databaseBuilder () aracılığıyla veritabanını yeniden doldurma.
Bink

Sqlite_sequence nedir?
RoyalGriffin

0

Açıklamayı kötüye @Querykullanmadan Odadan yararlanmak @Queryiçin önce tüm satırları seçmek ve bunları bir listeye koymak için kullanın , örneğin:

@Query("SELECT * FROM your_class_table")

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

Listesini silme notuna koyun, örneğin:

@Delete

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

0

İşte bunu Kotlin'de yaptım.

  1. DI (Koin) kullanarak aktivite db odasına enjekte edilir.

     private val appDB: AppDB by inject()
  2. Ardından clearAllTables () öğesini çağırabilirsiniz.

    private fun clearRoomDB () {GlobalScope.launch {appDB.clearAllTables () preferences.put (PreferenceConstants.IS_UPLOADCATEGORIES_SAVED_TO_DB, yanlış) preferences.put (PreferenceConstants.IS_MEMBERHANDBOOK_SAVED_TO_DB, yanlış)}}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.