এসকিউএলাইট ব্যবহার করে অ্যান্ড্রয়েডে বিদেশী কী বাধা? ক্যাসকেড মুছুন


91

আমার দুটি টেবিল রয়েছে: ট্র্যাক এবং ওয়েপয়েন্টস, একটি ট্র্যাকের অনেকগুলি পয়েন্ট থাকতে পারে, তবে একটি ওয়েপপয়েন্টটি কেবল 1 ট্র্যাকের জন্য বরাদ্দ করা হয়েছে।

উপায়গুলি সারণীতে আমার কাছে একটি ট্র্যাক "আইডি" নামে একটি কলাম রয়েছে যা একবার ট্র্যাক হয়ে গেলে ট্র্যাক_আইডি সন্নিবেশ করায় তবে এই কলামটিতে আমার কাছে বিদেশী কী বাধাগুলি সেটআপ করা হয়নি।

আমি যখন ট্র্যাকটি মুছতে চাইলে আমি নির্ধারিত ওয়েপপয়েন্টগুলি মুছতে চাই, এটা কি সম্ভব ?. আমি ট্রিগারগুলি ব্যবহার সম্পর্কে পড়ি তবে আমার মনে হয় না এগুলি অ্যান্ড্রয়েডে সমর্থিত।

ওয়েপয়েন্টস টেবিল তৈরি করতে:

public void onCreate(SQLiteDatabase db) {
    db.execSQL( "CREATE TABLE " + TABLE_NAME 
                + " (" 
                + _ID         + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
                + LONGITUDE   + " INTEGER," 
                + LATITUDE    + " INTEGER," 
                + TIME        + " INTEGER,"
                + TRACK_ID_FK + " INTEGER"
                + " );"
              );

    ...
}

উত্তর:


237

মুছে ফেলা ক্যাসকেডের সাথে বৈদেশিক কী সীমাবদ্ধতাগুলি সমর্থিত তবে আপনাকে সেগুলি সক্ষম করতে হবে।
আমি কেবলমাত্র আমার এসকিউলোপেনহেল্পারে নিম্নলিখিতটি যুক্ত করেছি , যা কৌশলটি মনে হচ্ছে।

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
}

আমি নীচে আমার রেফারেন্সিং কলাম ঘোষণা করলাম declared

mailbox_id INTEGER REFERENCES mailboxes ON DELETE CASCADE

59
যার অর্থ এটি কেবলমাত্র অ্যান্ড্রয়েড ২.২ ফ্রয়েও থেকে কাজ করে যার এসকিউএলটি ৩.6.২২ রয়েছে
সূচনা 12

@ রেডপ্ল্যানেট - এটি কেবল কারণ যখন ডাটাবেসে কোনও কিছু লেখা হয় তখনই এই সীমাবদ্ধতা প্রয়োগ করা হয়। (আপনি যা কিছু করেন তা ডিবি থেকে পড়লে আপনি এই সীমাবদ্ধতাটি ভাঙ্গতে পারবেন না) এছাড়াও, ফিল, ওপেন পদ্ধতির পরিবর্তে, অনকনফিগার পদ্ধতিতে এটি করা ভাল। সূত্র: ডেভেলপার.আ্যান্ড্রয়েড
রেফারেন্স

12
গুগল PRAGMAলিখিত বিবৃতি লেখার প্রস্তাব দিচ্ছে onConfigure()তবে এর জন্য এপিআই স্তরের 16 (অ্যান্ড্রয়েড 4.1) প্রয়োজন, এবং ততক্ষণে আপনি কেবল কল করতে পারেন setForeignKeyConstraintsEnabled
প্যাং

তোলা যায় বিদেশী কী সীমাবদ্ধতা সক্ষম করার বিষয়টি বিবেচনার করার প্রয়োজন হতে পারে onCreate/ onDowngrade/ onUpgrade, যা সামনে দাঁড়িয়ে আছে onOpen। দেখুন অ্যানড্রইড 4.1.1 মধ্যে সোর্স কোড
প্যাং করুন

4
@ নাটিক্স কলকে সুপার সহ কার্যকর কার্যকারিতা নিশ্চিত করে যদি বাস্তবায়িত শ্রেণি এবং তার পিতামাতার মধ্যে মধ্যবর্তী শ্রেণি চালু হয়।
tbm


26

যেমন ই.শিশকিনের পোস্টটি এপিআই 16 থেকে বলেছেন আপনার SqLiteOpenHelper.onConfigure(SqLiteDatabase)ব্যবহার পদ্ধতিতে বিদেশী কী সীমাবদ্ধতাগুলি সক্ষম করা উচিতdb.setForeignKeyConstraintsEnabled(boolean)

@Override
public void onConfigure(SQLiteDatabase db){
    db.setForeignKeyConstraintsEnabled(true);
}

10

আরও পূর্ণ উত্তর দিয়ে উত্তর দেওয়ার জন্য কোনও প্রশ্নেরও বেশি পুরানো হবেন না।

@Override public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        setForeignKeyConstraintsEnabled(db);
    }
    mOpenHelperCallbacks.onOpen(mContext, db);
}

private void setForeignKeyConstraintsEnabled(SQLiteDatabase db) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
        setForeignKeyConstraintsEnabledPreJellyBean(db);
    } else {
        setForeignKeyConstraintsEnabledPostJellyBean(db);
    }
}

private void setForeignKeyConstraintsEnabledPreJellyBean(SQLiteDatabase db) {
    db.execSQL("PRAGMA foreign_keys=ON;");
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void setForeignKeyConstraintsEnabledPostJellyBean(SQLiteDatabase db) {
    db.setForeignKeyConstraintsEnabled(true);
}

6

@ ফিল্ম যা উল্লেখ করেছেন তা ভাল। তবে বিদেশী স্থাপনের জন্য আপনি নিজেই ডেটাবেসে অন্য একটি ডিফল্ট পদ্ধতি ব্যবহার করতে পারেন। এটি সেটফোরেইনকিয়েস্ট্রাইটসইনবেবলড (সত্য)।

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;"); 
              //(OR)
        db.setForeignKeyConstraintsEnabled (true)
    }
}

দস্তাবেজের জন্য এসকিউএলডিডেটেজেস.সেটফোরেইনকি কীস্ট্রাইনেস সক্ষম করুন


4
আপনার পোস্ট করা ডকুমেন্টেশনটি পরামর্শ দেয়: A good time to call this method is right after calling openOrCreateDatabase(File, SQLiteDatabase.CursorFactory) or in the onConfigure(SQLiteDatabase) callback. সুতরাং পরিবর্তে onOpen, onConfigureসঠিক জায়গা বলে মনে হয়।
পল ওউইটাসেকেক

4

আমি মনে করি না এসকিউএলাইট বাক্সের বাইরে এটি সমর্থন করে। আমি আমার অ্যাপ্লিকেশনগুলিতে যা করছি তা হ'ল:

  1. লেনদেন তৈরি করুন
  2. বিশদ ডেটা মুছুন (আপনার উদাহরণের উপায়গুলি)
  3. মাস্টার ডেটা মুছুন (আপনার উদাহরণের ট্র্যাকগুলি)
  4. সাফল্যের উপর লেনদেন প্রতিশ্রুতিবদ্ধ

এইভাবে আমি নিশ্চিত যে সমস্ত ডেটা মুছে ফেলা হয়েছে বা কোনওটিই নয়।


তবে আপনি কি একটি পদ্ধতি ব্যবহার করে উভয় টেবিল থেকে মুছে ফেলছেন?
জ্যাকারসন

হ্যাঁ, আমি এপিআই থেকে নোটস নমুনার পাশাপাশি বেশ কিছুটা গিয়েছিলাম। আপনার ক্ষেত্রে ট্র্যাকটি কী হবে তা মুছে ফেলতে গিয়ে আমি লেনদেন তৈরি করি, ট্র্যাক এবং ওয়েপয়েন্টগুলি মুছি এবং লেনদেন করি। সব একসাথে।
থারস্টেন দিত্তমার

4

ট্রিগারগুলি অ্যান্ড্রয়েড দ্বারা সমর্থিত এবং এই ধরণের ক্যাসকেড মুছা স্ক্লাইট দ্বারা সমর্থিত নয়। অ্যান্ড্রয়েডে ট্রিগার ব্যবহার করার একটি উদাহরণ এখানে পাওয়া যাবে । যদিও থারস্টেনের বর্ণিত হিসাবে লেনদেনগুলি ব্যবহার করা সম্ভবত ট্রিগার হিসাবে ঠিক তত সহজ।


3

অ্যান্ড্রয়েড 1.6 এ এসকিউএলাইট সংস্করণটি 3.5.9 হয় তাই এটি বিদেশী কীগুলি সমর্থন করে না ...

http://www.sqlite.org/foreignkeys.html "এই নথিটি এসকিউএল সংস্করণ 3.6.19 এ প্রবর্তিত এসকিউএল বিদেশী কী সীমাবদ্ধতার জন্য সমর্থন বর্ণনা করে।"

ফ্রিওতে এটি এসকিউএলাইট সংস্করণ 3.6.22, তাই ...

সম্পাদনা: স্ক্লাইট সংস্করণটি দেখতে: এডিবি শেল স্ক্লাইট 3-রূপান্তর


এই জাতীয় প্রতিবন্ধকতাগুলিকে বাধ্য করার কোনও উপায় আছে .. আমার অর্থ স্ক্লাইট সংস্করণটি আপগ্রেড করার কোনও উপায় আছে .. কারণ আমাদের অবশ্যই অ্যান্ড্রয়েড ২.১ এ সফটওয়্যার সংস্করণটি সমর্থন করতে হবে যা উপরের মতো 3.5..9.৯ স্ক্লাইট সংস্করণ রয়েছে
নলপয়েন্টারএক্সপশন

না, আপনাকে
নিজেরাই

1

"মুছে ফেলা ক্যাসকেড" সহ বিদেশী কীগুলি অ্যান্ড্রয়েড 2.2 এবং তারপরে এসকিউএলাইটে সমর্থিত। তবে এগুলি ব্যবহার করার সময় সাবধানতা অবলম্বন করুন: কখনও কখনও একটি কলামে একটি বিদেশী কী ফায়ার করার সময় একটি ত্রুটি দেখা যায়, তবে আসল সমস্যাটি অন্য কোনও কলামের মধ্যে থাকে চাইল্ড টেবিলে বিদেশী কী বাধা, বা অন্য কোনও টেবিলটি এই টেবিলটির উল্লেখ করে।

দেখে মনে হচ্ছে এসকিউএলাইট তার মধ্যে একটি গুলি ছড়িয়ে দেওয়ার সময় সমস্ত প্রতিবন্ধকতাগুলি পরীক্ষা করে। এটি ডকুমেন্টেশনে উল্লেখ করা হয়েছে। ডিডিএল বনাম ডিএমএল সীমাবদ্ধতা পরীক্ষা করে।


0

আপনি যদি অ্যান্ড্রয়েড রুম ব্যবহার করে থাকেন তবে নীচের মত দেখাচ্ছে।

Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
    .addCallback(object : RoomDatabase.Callback() {
        // Called when the database has been opened.
        override fun onOpen(db: SupportSQLiteDatabase) {
            super.onOpen(db)
            //True to enable foreign key constraints
            db.setForeignKeyConstraintsEnabled(true)
        }

        // Called when the database is created for the first time. 
        override fun onCreate(db: SupportSQLiteDatabase) {
            super.onCreate(db)
        }
    }).build()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.