Android SQLite Database में नया कॉलम कैसे जोड़ें?


83

मुझे Android SQLiteडेटाबेस में एक समस्या है ।

मेरे पास एक तालिका है जिसमें एक फ़ील्ड है। SudentFname और वह एप्लिकेशन एंड्रॉइड 2.3.1 के साथ ठीक काम कर रहा है और अब अगर मैं किसी अन्य फ़ील्ड को जोड़ता हूं तो मेरा एप्लिकेशन ठीक से काम नहीं कर रहा है।

क्या कोई मेरी मदद कर सकता है जो डेटाबेस को अच्छी तरह से जानता है,

जवाबों:


189

आप ALTER TABLEअपनी onUpgrade()विधि पर फ़ंक्शन का उपयोग कर सकते हैं , जैसे:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // If you need to add a column
  if (newVersion > oldVersion) {
     db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
  }
}

जाहिर है, कॉलम परिभाषा के आधार पर SQLite अलग होगा।


1
नमस्ते! मैंने कोशिश की है कि मैंने इसे अपग्रेड विधि पर इस्तेमाल किया है और इसके अंदर मैंने टेबल क्वेरी को भी बदल दिया है। लेकिन फिर भी मैं डेटाबेस में नया कॉलम नहीं जोड़ पा रहा हूं.. लेकिन फिर जब मैं नया कॉलम जोड़ने के लिए एक प्रश्न लिखूंगा और उसका नाम बदल दिया जाए डेटाबेस और टेबल का नाम दोनों की तुलना में मैं नया कॉलम जोड़ने में सक्षम हूं..लेकिन परिवर्तन तालिका पद्धति की सहायता से मैं ऐसा करने में सक्षम नहीं हूं.. डेटाबेस और तालिका वांछित कार्य नहीं है..यह परिवर्तन के साथ काम करना चाहिए। table..still मैं इसे परिवर्तन तालिका विधि के साथ करने में सक्षम नहीं हूँ ..
Aamirkhan

@ नागार्जुनरेड्डी को देर से उत्तर के लिए खेद है। आप इस विधि का उपयोग कर सकते हैं db.execSQL ("अद्यतन तालिका सेट करें कुंजी = कुंजी + 1 WHERE नाम =?", नया स्ट्रिंग [] {नाम});
देवयुद्ध

3
डेटाबेस संस्करण को बढ़ाने के लिए मत भूलना, अन्यथा onUpgrad () नहीं कहा जाएगा। नीचे दिए गए कोड में संस्करण संख्या बढ़ाएं, जो उस वर्ग के कंस्ट्रक्टर में मौजूद होगा जो SQLiteOpenHelper वर्ग का विस्तार करता है। सुपर (संदर्भ संदर्भ, स्ट्रिंग नाम, CursorFactory कारखाना, int newVersion)
appdroid

ऐप फ्रीज़ और मेरे पास लॉग कैट पर इस तरह के कई संदेश हैं: डेटाबेस '+ डेटा + उपयोगकर्ता + 0 + कॉम ..._ डीबी' के लिए कनेक्शन पूल 1x (मुख्य) के लिए फ्लैक्स 0x5 के साथ कनेक्शन देने में असमर्थ रहा है। ऐसा क्यों हुआ?
महदी

if (newVersion > oldVersion) यहां स्थिति अनावश्यक है क्योंकि onUpgradeखुद को केवल तभी बुलाया जाता है जब यह शर्त पूरी होती है अर्थात नया संस्करण पुराने संस्करण से अधिक है
शुरुआत

31

मुझे अपने स्वयं के ऐप पर सहायता की आवश्यकता होने पर इस थ्रेड में आया, लेकिन कई उत्तरों के साथ मुद्दों को देखा। मैं निम्नलिखित करने की सलाह दूंगा:

private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;";

private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;";

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
         db.execSQL(DATABASE_ALTER_TEAM_1);
    }
    if (oldVersion < 3) {
         db.execSQL(DATABASE_ALTER_TEAM_2);
    }
}

आप यह सुनिश्चित करना चाहते हैं कि कोड तब काम करेगा जब उपयोगकर्ता 1 से अधिक संस्करण अपग्रेड करें और यह कि अपडेट स्टेटमेंट केवल उसी अपग्रेड को चलाता है जो इसकी आवश्यकता है। इस पर थोड़ा और जानने के लिए, इस ब्लॉग को देखें


क्या करना है अगर हम डिफ़ॉल्ट स्ट्रिंग मूल्य के साथ बदल स्तंभ बनाना चाहते हैं ??
श्रीदत्त कोठारी

22

ऐसा करने का सबसे आसान तरीका है SQL to the onUpgrade(), अपने में कुछ विधि जोड़ना SQLiteOpenHelper class। कुछ इस तरह:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    // If you need to add a new column
    if (newVersion > oldVersion) {
        db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0");
    }
}

मैंने यह कोशिश की है, लेकिन फिर भी मैं upgrate पद्धति में परिवर्तन तालिका विधि का उपयोग करके नए कॉलम को जोड़ने में सक्षम नहीं हूं।
आमिरखान

नमस्ते! मैंने कोशिश की है कि मैंने इसे अपग्रेड विधि पर इस्तेमाल किया है और इसके अंदर मैंने टेबल क्वेरी को भी बदल दिया है। लेकिन फिर भी मैं डेटाबेस में नया कॉलम नहीं जोड़ पा रहा हूं.. लेकिन फिर जब मैं नया कॉलम जोड़ने के लिए एक प्रश्न लिखूंगा और उसका नाम बदल दिया जाए डेटाबेस और टेबल का नाम दोनों की तुलना में मैं नया कॉलम जोड़ने में सक्षम हूं..लेकिन परिवर्तन तालिका पद्धति की सहायता से मैं ऐसा करने में सक्षम नहीं हूं.. डेटाबेस और तालिका वांछित कार्य नहीं है..यह परिवर्तन के साथ काम करना चाहिए। table..still मैं इसे बदलने की तालिका विधि के साथ नहीं कर पा रहा हूँ
Aamirkhan

@ user370305 क्या मुझे पहली बार ऐप इंस्टॉल करने वाले नए उपयोगकर्ताओं के लिए टैब्लल में नया कॉलम जोड़ना होगा?
अहसानाली सुथार

15

शायद स्विच के उपयोग से थोड़ा अधिक सुरुचिपूर्ण दृष्टिकोण यदि / इसके बाद किसी भी स्कीमा से सबसे हाल के स्कीमा में अपग्रेड हो जाएगा ...

यहाँ एक सारणी को बदलने के लिए वाक्यविन्यास पर एक अच्छा पृष्ठ है: http://alvinalexander.com/android/sqlite-alter-table-syntax-examples

public static final String TABLE_TEAM = "team";
public static final String COLUMN_COACH = "coach";
public static final String COLUMN_STADIUM = "stadium";


private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;";

private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE "
    + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;";


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    switch (oldVersion)
    {
        case 1:
            //upgrade from version 1 to 2
            db.execSQL(DATABASE_ALTER_TEAM_TO_V2);
        case 2:
            //upgrade from version 2 to 3
            db.execSQL(DATABASE_ALTER_TEAM_TO_V3);

        //and so on.. do not add breaks so that switch will
        //start at oldVersion, and run straight through to the latest

    }

}

यह कई उन्नयन को संभालने का तरीका है। किस वर्जन से आता है चेक!
रिकार्डो

यदि आप सीधे संस्करण 1 से 3 तक जाते हैं (यदि कोई व्यक्ति ऐप को अपडेट नहीं करता है), तो आप मामले 2 तक नहीं पहुंचेंगे।
TyMarc

@ TyMarc-- हां, यह 2 संस्करणों में अपग्रेड करेगा। 3. स्विच पुराने संस्करण का उपयोग करता है। इसलिए, आपके उदाहरण में, पुराना संस्करण 1 है। कोड तब केस 1 चलाएगा, जो 1 से 2 के संस्करणों से अपग्रेड होता है, और फिर केस 2 चलेगा (क्योंकि कोई ब्रेक नहीं है;), जो 2 से 3 तक अपग्रेड करता है। यह वर्णन में सब ठीक है।
एडवर्ड बागबी

4

मैंने निम्नलिखित दृष्टिकोण किया है, यह मेरे लिए पुनर्विकसित है

अगर DB संस्करण: 6

Ex : There is a table with 5 columns

जब आप अपग्रेड करते हैं: 7 (मैं 3 टेबल में 1 नया कॉलम जोड़ रहा हूं)

 1. We need to add the columns when creating a table

 2. onUpgrade method:

 if (oldVersion < 7) 
 { 
    db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
    db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
    db.execSQL(DATABASE_ALTER_PAPER_LABEL); 
 }

कहां: "DATABASE_ALTER_ADD_PAPER_PAID" क्वेरी है।

EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE "
                + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";

दो ऑपरेशन के बाद यह ताजा इंस्टॉल उपयोगकर्ता और ऐप अपग्रेड उपयोगकर्ता के लिए ठीक काम करेगा


3

@ Aamirkhan.i को लगता है कि आपने टिप्पणी में बताई गई समस्या को बहुत पहले हल कर लिया होगा। मुझे लगता है कि आपने डेटा बेस संस्करण में वृद्धि नहीं की है। या फिर यहां उत्तर सीधे आगे हैं। मैं इसे लिख रहा हूं क्योंकि यह किसी को भी मदद कर सकता है जिन्होंने किसी तालिका में फेरबदल करते समय अपना डेटा आधार संस्करण संख्या नहीं बढ़ाई या बदल दी है।


हाँ, डेटाबेस का नाम बदलना और आवेदन को
रद्द

@ आमिरचन, कृपया अगले उत्तर के लिए चेक को स्थानांतरित करें ताकि जनता के लिए अधिक स्पष्ट समाधान उपलब्ध हो।
एलेओओप

3

मुझे लगता है कि हमें इस तरह की स्थिति की जांच नहीं करनी चाहिए

 if (newVersion > oldVersion) {
 }

क्योंकि यदि हम इसका उपयोग करते हैं, तो इसका मतलब है कि हर बार जब हम डेटाबेस संस्करण को बढ़ाते हैं तब onUpdrade () कॉल करेगा और स्थिति सही होगी, इसलिए हमें इस तरह की जांच करनी चाहिए

if(oldVersion==1) 
{

}

इसलिए इस मामले में यदि पुराना संस्करण 2 है, तो स्थिति झूठी होगी और पुराने संस्करण 2 के साथ उपयोगकर्ता डेटाबेस को अपडेट नहीं करेगा (जो उपयोगकर्ता केवल संस्करण 1 के लिए चाहता है), क्योंकि उन उपयोगकर्ताओं के लिए डेटाबेस पहले ही अपडेट किया गया था।


1

तालिका में एक नया कॉलम जोड़ने के लिए जिसका आपको उपयोग करने की आवश्यकता है ALTER। Android में आप अंदर नया कॉलम जोड़ सकते हैं onUpgrade()

आप आश्चर्यचकित हो सकते हैं कि onUpgrade()नया कॉलम कैसे जोड़ेगा?

जब आप एक उपवर्ग लागू करते हैं SQLiteOpenHelper, तो आपको सुपरक्लास कंस्ट्रक्टर को कॉल करने की आवश्यकता होती है: super(context, DB_NAME, null, 1);आपके क्लास कंस्ट्रक्टर में। वहां मैंने 1संस्करण के लिए पारित किया है।

जब मैंने संस्करण 1को ऊपर ( 2या अधिक) में बदल दिया , onUpgrade()तो आह्वान किया जाएगा। और एसक्यूएल संशोधनों को निष्पादित करें जो मैं करने का इरादा रखता हूं। संस्करण बदलने के बाद मेरा वर्ग निर्माता:

public DatabaseHelper(Context context) {
    super(context, DB_NAME, null, 2);//version changed from 1 to 2
}

एसक्यूएल संशोधन इस तरह की जाँच करता है, सुपरक्लास कंस्ट्रक्टर स्टोर किए गए SQLite db फ़ाइल के संस्करण की तुलना उस संस्करण से करता है जिसे मैंने पास किया था super()। यदि ये (पिछले और अब) संस्करण संख्या भिन्न हैं, onUpgrade()तो इनवॉइस हो जाता है।

कोड इस तरह दिखना चाहिए:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // add new columns to migrate to version 2
    if (oldVersion < 2) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)");
    }
    // add new columns to migrate to version 3
    if (oldVersion < 3) { 
        db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER");
    }
}

1

बस अपने कोड में परिवर्तन करें

निजी अंतिम int DATABASE_VERSION = 1;

सेवा

निजी स्थिर अंतिम int DATABASE_VERSION = 2;


0

मैं उसी मुद्दे की खोज करते हुए लिंक पर आया। यह बताता है कि उन्नयन का उपयोग कैसे करें। https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

यह बताता है कि नीचे दिए गए कोड का उपयोग क्यों करना है

 @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion < 2) {
             db.execSQL(DATABASE_ALTER_TEAM_1);
        }
        if (oldVersion < 3) {
             db.execSQL(DATABASE_ALTER_TEAM_2);
        }
    }

0

टेबल पर एक नया कॉलम बनाने का सबसे आसान तरीका है SQLiteOpenHperper class में onUpgrad () मेथड में कुछ SQL जोड़ना। पसंद:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch (oldVersion) {
        case 1:
            db.execSQL(SQL_MY_TABLE);

        case 2:
            db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT");
    }
}

0

सबसे पहले, डेटाबेस संस्करण संख्या बढ़ाएँ। और फिर onUpgradeविधि में, आप जाँच सकते हैं कि क्या कॉलम पहले से मौजूद है यदि नहीं तो केवल कॉलम जोड़ें

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   if(!existsColumnInTable(db, TABLE_NAME, COLUMN_NAME)){
      db.execSQL("ALTER TABLE foo ADD COLUMN COLUMN_NAME INTEGER DEFAULT 0");
 } 
 }

private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) {
    Cursor cursor = null;
    try {
        // Query 1 row
        cursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null);

        // getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1
        if (cursor.getColumnIndex(columnToCheck) != -1)
            return true;
        else
            return false;

    } catch (Exception Exp) {
        return false;
    } finally {
        if (cursor != null) cursor.close();
    }
}

यह विधि इस लिंक से निकाली गई है, जाँच करें कि क्या एंड्रॉइड में एप्लिकेशन डेटाबेस में कोई कॉलम मौजूद है

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