मैं SQLite में अपनी एक टेबल के लिए नया कॉलम जोड़ना चाहता हूं।

मुझे पता है कि मैं इसे मौजूदा उपयोगकर्ताओं के लिए OnUpgrade() विधि में जोड़कर प्राप्त कर सकता हूं

db.execSQL("ALTER TABLE my_table ADD COLUMN my_column2 INTEGER DEFAULT 0");

और onCreate() विधि में तालिका निर्माण नीचे की तरह रहेगा

 db.execSQL("CREATE TABLE IF NOT EXISTS \"my_table\" (\"coulmn_1\" INTEGER PRIMARY KEY  NOT NULL  UNIQUE)");

अब क्या होगा यदि कोई नया उपयोगकर्ता एप्लिकेशन इंस्टॉल करता है? केवल onCreate() को ही कॉल किया जाएगा क्योंकि उपयोगकर्ता के पास डेटाबेस का कोई पिछला संस्करण नहीं है। और onCreate() विधि में इसमें नया कॉलम coulmn_2 . शामिल नहीं है

तो क्या मैं टेबल निर्माण को onCreate() में भी अपडेट कर दूं? या यह मौजूदा उपयोगकर्ताओं के लिए समस्याएँ पैदा करेगा?

1
r_via 1 नवम्बर 2020, 10:09

1 उत्तर

सबसे बढ़िया उत्तर

अब क्या होगा यदि कोई नया उपयोगकर्ता एप्लिकेशन इंस्टॉल करता है? केवल onCreate() को कॉल किया जाएगा क्योंकि उपयोगकर्ता के पास डेटाबेस का कोई पिछला संस्करण नहीं है।

यही कारण है कि CREATE TABLE स्टेटमेंट में onCreate() के अंदर नया कॉलम शामिल होना चाहिए:

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(
        "CREATE TABLE IF NOT EXISTS my_table(" +
        "column_1 INTEGER PRIMARY KEY  NOT NULL, " +
        "my_column2 INTEGER DEFAULT 0)"
    );
}

विधि onCreate() को केवल तभी कहा जाता है जब डेटाबेस मौजूद न हो, जिसका अर्थ है कि उपरोक्त कथन उन उपकरणों पर निष्पादित किया जाएगा जिनके पास पुराने डेटाबेस के साथ ऐप का आपका पिछला संस्करण नहीं है।

उस उपयोगकर्ता के लिए जिसने आपके ऐप के पिछले संस्करण को पहले ही इंस्टॉल कर लिया है onCreate() को कॉल नहीं किया जाएगा, लेकिन onUpgrade() को निष्पादित किया जाएगा और वहां आपको वह कोड डालना चाहिए जो नया कॉलम जोड़ता है।
इसलिए, उदाहरण के लिए अपने डेटाबेस के संस्करण को 2 में बदलें (यह आपके ऐप के संस्करण के समान नहीं है) और:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL("ALTER TABLE my_table ADD COLUMN my_column2 INTEGER DEFAULT 0");
    }
}
0
forpas 1 नवम्बर 2020, 07:51