2011-04-16 13 views
13

मेरे पास एनिमल नामक एक कार्य तालिका के साथ चल रहा एक एप्लिकेशन है। इस तालिका को बनाने के पहले इसे _id और animal_name कॉलम में शामिल किया गया था।एसक्यूलाइट तालिका को अपग्रेड करने में कठिनाई

private static final String DATABASE_CREATE = 



      "create table " + ANIMALS_TABLE + 

      " (_id integer primary key autoincrement, " + 

      "animal_name text not null, " + 

      "biography text not null);"; 
:

अब मैं इस पर विस्तार करने के लिए हालांकि मैं एक छोटे से difficulty.At हो रहा है पहले मैंने सोचा था कि मैं सिर्फ अपनी CREATE_TABLE बयान उन्नयन पशु जैव शामिल करने के लिए की एक मामला था कोशिश कर रहा हूँ, एक animal_biography स्तंभ सहित,

हालांकि, लॉगकैट को देखते हुए यह मुझे बताता है कि इसमें सम्मिलित करने का प्रयास करते समय कॉलम जीवनी मौजूद नहीं है।

अब, मैं onUpgrade() का उपयोग करने और कोड

db.execSQL("ALTER TABLE" + DATABASE_NAME); 
db.execSQL(DATABASE_CREATE); 

शामिल करके डेटाबेस को अपग्रेड करने की कोशिश की है, लेकिन यह या तो समस्या को हल करने नहीं है। क्या किसी को इस समस्या को ठीक करने के बारे में कोई संकेत है?

+0

ठीक है, मैंने समस्या का हल ढूंढने में कामयाब रहा है। मुझे एप्लिकेशन से डेटाबेस को हटाने की आवश्यकता है ताकि यह संशोधित कोड के साथ स्टार्टअप पर एक नई नई तालिका तैयार करे, मैंने डेटाबेस को निम्नानुसार हटा दिया: फ़ाइल dbFile = getDatabasePath ("Path_Name"); dbFIle.delete(); – Jnanathan

+0

आप डीडीएमएस फ़ाइल ब्राउज़र का उपयोग कर डेटाबेस फ़ाइल को हटा सकते हैं। – GrAnd

उत्तर

52

यदि आप SQLiteOpenHelper का उपयोग कर रहे हैं तो यह तालिका को अपग्रेड करना आसान है। आपको onCreate और onUpgrade विधियों को लागू करने और कक्षा नियंत्रक में अपने डेटाबेस का वर्तमान संस्करण प्रदान करने की आवश्यकता है। अपनी तालिका को अपडेट करते समय बस डेटाबेस संस्करण संख्या में वृद्धि करें, onCreate विधि में नई तालिका निर्माण क्वेरी निर्दिष्ट करें और तालिका के पिछले संस्करण को अद्यतन करने के लिए onUpgrade विधि डालें। जब एंड्रॉइड डेटाबेस संस्करण विसंगति का पता लगाता है, तो यह स्वचालित रूप से onUpgrade विधि को कॉल करेगा। उदाहरण देखें:

public class OpenHelper extends SQLiteOpenHelper { 

    private final static int DB_VERSION = 2; 

    public TracksDB(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     final String CREATE_TBL = 
      "create table " + ANIMALS_TABLE + 
      " (_id integer primary key autoincrement, " + 
      "animal_name text not null, " + 
      "biography text not null);"; 
      db.execSQL(CREATE_TBL); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     if (oldVersion < 2) { 
      final String ALTER_TBL = 
       "ALTER TABLE " + ANIMALS_TABLE + 
       " ADD COLUMN biography text not null;"; 
      db.execSQL(ALTER_TBL); 
     } 
    } 
} 

उन्नयन का यह तरीका, उपयोगकर्ता डेटा खोने के बिना तालिकाओं को संशोधित करने का सही तरीका है, खासकर यदि एप्लिकेशन पहले से ही जनता के लिए जारी किया गया था।

+0

शांत, चीज़ों को स्पष्ट बनाने के लिए धन्यवाद। – Jnanathan

+1

@GrAnd - आपके उत्तर के लिए धन्यवाद, इससे बहुत मदद मिली। हालांकि वह उदाहरण काम नहीं करेगा, क्योंकि आप डिफ़ॉल्ट मान निर्दिष्ट किए बिना "शून्य नहीं" कॉलम जोड़ नहीं सकते हैं, जैसे: "COLUMN जीवनी टेक्स्ट जोड़ें डिफ़ॉल्ट डिफ़ॉल्ट डिफ़ॉल्ट_बिला नहीं है" – Koger

+1

मुझे एक ही समस्या है और मैंने पहले से ही उपरोक्त विधि लागू की है , मैंने संस्करण संख्या बदल दी है, लॉग/डीबग यह भी दिखाता है कि अपग्रेड पर कॉल किया जाता है, और कोई अपवाद नहीं है (मुझे लगता है कि यह सफलतापूर्वक क्वेरी निष्पादित करता है)। लेकिन जब मैं वस्तुओं को लोड करने का प्रयास करता हूं (फिलहाल कोई रिकॉर्ड नहीं है क्योंकि मैंने टेबल को गिरा दिया है और फिर से बनाया है) यह अभी भी अपवाद फेंकता है कि नया कॉलम मौजूद नहीं है। अनइंस्टॉल करने वाले एप्लिकेशन का कोई प्रभाव नहीं पड़ता है। –

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