কক্ষের অবিরাম লাইব্রেরি। সব মুছে ফেলুন


181

আমি কীভাবে রুম অধ্যবসায় গ্রন্থাগারটি ব্যবহার করে নির্দিষ্ট টেবিলের সমস্ত এন্ট্রি মুছতে পারি? আমার টেবিল ড্রপ করতে হবে, তবে এটি কীভাবে করা যায় সে সম্পর্কে আমার কোনও তথ্য খুঁজে পাওয়া যায় না।

কেবলমাত্র যখন ডাটাবেস স্থানান্তরিত হয় বা সমস্ত এন্ট্রি লোড করতে এবং সেগুলি মুছতে :)


14
কক্ষের ১.১.০ হিসাবে আপনি ব্যবহার করতে পারেন clearAllTables()যা "এই ডাটাবেসে নিবন্ধিত সমস্ত টেবিল থেকে সমস্ত সারি সরিয়ে দেয় সত্তা () হিসাবে।" আমি এটি নীচে একটি উত্তর হিসাবে অন্তর্ভুক্ত করেছি, কিন্তু দৃশ্যমানতার জন্য এখানে পুনরুত্পাদন করছি।
ডিক লুকাস

উত্তর:


442

এটি করার জন্য আপনি একটি ডিএও পদ্ধতি তৈরি করতে পারেন।

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

3
আহ, আমি এটা ভাবিনি। আমি ধরে নিয়েছি যে @Queryফলাফলগুলি সেটগুলির মতোই সীমাবদ্ধ ছিল (অনুরূপ rawQuery())। খুব ঠান্ডা!
কমন্সওয়্যার

1
@ আইজিট আমি কী অনুরোধ করতে পারি যে @Deleteকোনও পরামিতি না নিয়ে সমস্ত টেবিল থেকে মুছুন? আমি ফাইল করার জন্য রুমের ট্র্যাকার সন্ধান করার চেষ্টা করছি ...
ফিলিপ ডুয়ার্টে

4
সতর্ক থেকো! রুম আলফা 4 সংস্করণ হিসাবে, এই কৌশলটি গ্রেড বিল্ড ব্যর্থতার দিকে পরিচালিত করবে: ইস্যুয়েট্র্যাকার.google.com/issues/63608092
yshahak

1
কীভাবে Ids? আমি এটি পছন্দ করেছিলাম তবে টেবিল আইডিগুলি বৃদ্ধি অবিরত করে। বাস্তব টেবিল ড্রপ আইডি আবার 0 থেকে শুরু করতে বাদ দেওয়া হয়।
আইওনে শারভাদজে

6
@yigit জিজ্ঞাসাটি সফলভাবে চলেছে কিনা বা ত্রুটি আছে কিনা তা খুঁজে বের করার কোনও উপায় আছে?
আদিত্য লাডওয়া

106

রুম হিসাবে 1.1.0আপনি ক্লিয়ারআল টেবিল () ব্যবহার করতে পারেন যা:

সত্তা () হিসাবে এই ডাটাবেসে নিবন্ধিত সমস্ত সারণী থেকে সমস্ত সারি মুছে ফেলা হয়।


44
সতর্কতা অবলম্বন করুন: ক্লিয়ারএলটেলগুলি () অবিচ্ছিন্ন এবং এটি কখন শেষ হবে তা বলার উপায় নেই।
আলেক্সি

2
@ অ্যালক্সি কিন্তু ক্লিয়ারএলটবলের পরে কিছু বাঁচানোর চেষ্টা করতে কোনও সমস্যা হতে পারে? হিসাবে এটি কি সাফ করার পরে কেবল sertোকানোর চেষ্টা করবে? কারণ আমি ঠিক আছে।
ফার্স্টওন

2
@ ফার্স্টওন ক্লিয়ারঅল টেবিলগুলি মূলত একটি নতুন ব্যাকগ্রাউন্ড থ্রেডে লেনদেন শুরু করে। এটি টেবিলগুলি থেকে সমস্ত ডেটা মুছে ফেলে এবং তারপরে সেই লেনদেনের প্রতিশ্রুতি দেয়। আপনি যদি ক্লিয়ারএল টেবিলগুলি শুরু করার চেয়ে পরে আপনার লেনদেন শুরু করেন তবে আপনি ঠিক আছেন। বলা হচ্ছে, আপনি যদি ক্লিয়ারএল টেবিলের কল করার পরে কিছুটা তথ্য সন্নিবেশ করানোর চেষ্টা করেন তবে ক্লিয়ারএল টেবিল লেনদেন শুরু হওয়ার আগে আপনার সন্নিবেশ শুরু হতে পারে এবং আপনি আপনার সমস্ত ডেটা আলগা করুন। ক্লিয়ারএল টেবিলের কল করার পরে আপনার যদি নতুন ডেটা toোকানোর দরকার হয় তবে কমপক্ষে কিছুটা বিলম্ব যোগ করুন।
অ্যালেক্সি

2
@ অ্যালেক্সি কোনও কলব্যাক পদ্ধতি ব্যবহার করার কোনও উপায় বা মুছে ফেলা লেনদেনের অবস্থা নির্ধারণের অনুরূপ কি? অন্য কথায়, যদি মুছে ফেলা লেনদেনের অবস্থা সম্পূর্ণ হয়, তবে সন্নিবেশ ডেটা পদ্ধতিতে এগিয়ে যান।
এজেডাব্লু

1
@ এজেডাব্লু না, এখন পর্যন্ত, অপারেশনটি কখন সম্পূর্ণ হবে তা বলার উপায় নেই। আপনার যদি সত্যিই এই কার্যকারিতাটির প্রয়োজন হয় 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();

দ্রষ্টব্য: এখানে মাইমোডেল একটি সারণীর নাম।


আপনার আপডেট কোড ত্রুটিটি ব্যবহার করার পরে আমি এই ত্রুটিটি পেয়েছি: একটি বিমূর্ত ডিএও পদ্ধতি অবশ্যই নীচের একটি এবং একটিতে টীকায়িত করা উচিত: sertোকান, মুছুন, অনুসন্ধান করুন, আপডেট করুন, RawQuery শূন্যতা মোছা ();
bramastaVic

12

এড়ানোর জন্য নিচের মত আরএক্সজাবার সাথে ক্লিয়ারআলটেলগুলি () ব্যবহার করুন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());


                }
            });

3

ব্যাকগ্রাউন্ডে এই টাস্কটি কার্যকর করতে 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 {}আরএক্সজাভা
এরিক

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

এটির মূল্যের জন্য, আমি প্রসঙ্গটি.ডিলেটডেটাবেস ("নাম") এর মাধ্যমে এটি করা সবচেয়ে সহজ খুঁজে পেয়েছি এবং কেবলমাত্র রুম.ডাটাবেসবিল্ডার () এর মাধ্যমে ডাটাবেসটিকে পুনরায় স্থাপন ও পুনরায় প্রবর্তন করে first প্রথম অ্যাক্সেসের পরে অ্যাডক্যালব্যাক।
বিনকে

স্ক্লাইট_সেক্সেন্স কি?
রয়েলগ্রিফিন

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. তারপরে আপনি কেবল ক্লিয়ারঅল টেবিলগুলি () কল করতে পারেন

    ব্যক্তিগত মজাদার ক্লিয়ারমূডবিবি () {গ্লোবালস্কোপ.লাঞ্চ {appDB.clearAllTables () পছন্দসইগুলি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.