2011-11-28 16 views
60

मुझे एंड्रॉइड SQLite डेटाबेस के साथ एक समस्या है।एंड्रॉइड SQLite डेटाबेस में नया कॉलम कैसे जोड़ें?

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

किसी को भी मेरी मदद कर सकते हैं, जो बहुत अच्छी तरह से डेटाबेस जानता है,

उत्तर

146

आप 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

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

+0

0,1,2,3, .......... – NagarjunaReddy

+0

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

19

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

@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"); 
    } 
} 
+0

मैंने कोशिश की है लेकिन फिर भी मैं अपग्रेड विधि में बदलाव तालिका विधि का उपयोग कर नया कॉलम जोड़ने में सक्षम नहीं हूं। – Aamirkhan

+0

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

+0

के साथ करने में सक्षम नहीं हूं, ऑटो वृद्धि 0,1,2,3, .......... – NagarjunaReddy

3

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

+0

हां, डेटाबेस नाम और अनइंस्टॉलिंग एप्लिकेशन बदलना और इसे फिर से इंस्टॉल करना समस्या को हल करेगा – Aamirkhan

+0

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

17

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

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 से अधिक संस्करण को अपग्रेड काम करेंगे और उस अद्यतन बयान केवल चलाता है एक उन्नयन यह आवश्यक है बनाना चाहते हैं। इस पर थोड़ा और, इस blog देखें।

+0

क्या करना है यदि हम डिफ़ॉल्ट स्ट्रिंग मान के साथ परिवर्तित कॉलम बनाना चाहते हैं ?? –

+3

बेस्ट समाधान मैंने पढ़ा है और अच्छा ब्लॉग बीटीडब्ल्यू! – MrBrightside

13

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

यहाँ भी एक टेबल में फेरबदल के लिए वाक्यविन्यास पर एक सभ्य पेज है: 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 

    } 

} 
+0

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

+0

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

+0

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

2

मुझे लगता है कि हम चाहते हैं कि

if (newVersion > oldVersion) { 
} 

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

if(oldVersion==1) 
{ 

} 
इसलिए इस मामले में

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

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

नीचे इस का उपयोग करने के SQLiteOpenHelper कक्षा में onUpgrade() विधि करने के लिए कुछ एसक्यूएल जोड़ने बताते हैं। जैसा:

@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"); 
    } 
} 
1

तालिका ALTER उपयोग करने के लिए आप की जरूरत के लिए एक नया स्तंभ जोड़ने के लिए। एंड्रॉइड में आप 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 
} 

एसक्यूएल संशोधनों चेक, सुपर क्लास निर्माता संस्करण है कि मैं super() के लिए पारित के साथ संग्रहीत SQLite db फ़ाइल का संस्करण है। यदि ये (पिछले और अब) संस्करण संख्या अलग हैं 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"); 
    } 
} 
2

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

के लिए resovled है अगर डीबी संस्करण: 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;"; 

ऊपर के बाद दो आपरेशन कहीं भी होगी ठीक काम करता है ताजा के लिए स्थापित उपयोगकर्ता और एप्लिकेशन को उन्नत उपयोगकर्ता

संबंधित मुद्दे