2011-12-24 14 views
7

मेरे पास एक डेटाबेस है जिसे मैं एक कॉलम जोड़ना चाहता हूं, मैंने स्थिर डेटाबेस संस्करण बदल दिया है, लेकिन जब मैं अपने डिवाइस पर प्रोग्राम चलाता हूं तो नया कॉलम अभी भी नहीं है इसलिए मुझे लगता है कि मेरा onUpdate कॉल नहीं हो रहा है और मैं हूं यकीन नहीं है कि क्यों।sqlite डेटाबेस संस्करण अद्यतन कर रहे हैं?

यह है कि कैसे मैं डेटाबेस

 private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      createTables(db); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
           int newVersion) 
     { 
      Log.w("CalendarDB", "Upgrading database from version " + oldVersion 
        + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS Events_Table"); 
      onCreate(db); 
     } 

     private void createTables(SQLiteDatabase db){ 
      db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " + 
        EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, " + DATE + " TEXT, " + START + " LONG, " + END + " TEXT, " + REAL_START_TIME + " TEXT," 
        + REAL_END_TIME + " TEXT," + COLOR + " TEXT, " + BLINK + " TEXT, " + VIBRATE + " TEXT, " + RING_TONE_PATH + " TEXT, " + ICON + " TEXT, " + REMINDERS + 
        " TEXT, " + START_WITH_REMINDER + " TEXT, " + CALENDAR_ID + " TEXT, " + EVENT_ID + " TEXT);"); 
     } 
    } 

है कुछ और बनाने मैं onUpdate कहा जाता है करने के लिए प्राप्त करने के लिए क्या करना है? मैं निम्नलिखित this answer लेकिन कोशिश की अभी भी कोई परिणाम

उत्तर

11

आदेश डाटाबेस एंड्रॉयड में आप एक के बाद DATABASE_VERSION को बढ़ा चाहिए उन्नयन करने के लिए, SQLOpenHelper को यह जानने के लिए कि इसे ऑन अपग्रेड विधि कहा जाना चाहिए।

Rembember

यह केवल काम जब आप getWritableDatabase (कॉल) अन्यथा यह अपग्रेड नहीं करेंगे। और अगर आप संस्करण बदल सकते हैं और getReadableDatabase फोन यह एक अपवाद

throw new SQLiteException("Can't upgrade read-only database from version " + 
         db.getVersion() + " to " + mNewVersion + ": " + path); 

लेकिन क्यों दिखाई देगा? आप देखते हैं जब आप getWritableDatabase फोन संस्करण मौसम कोड की जांच एक ही है:

if (version != mNewVersion) { 
       db.beginTransaction(); 
       try { 
        if (version == 0) { 
         onCreate(db); 
        } else { 
         if (version > mNewVersion) { 
          onDowngrade(db, version, mNewVersion); 
         } else { 
          onUpgrade(db, version, mNewVersion); 
         } 
        } 
        db.setVersion(mNewVersion); 
        db.setTransactionSuccessful(); 
       } finally { 
        db.endTransaction(); 
} 
} 

अद्यतन

खैर पता चला है कि यह बाद से कोड में आप हमेशा हो रही है getReadableDatabase() के साथ काम करना चाहिए एक WrittableDatabase भी। इसलिए इसे दोनों विधिओं के साथ काम करना चाहिए, यहां getReadableDatabase():

डेटाबेस बनाएं और/या खोलें। यह वही ऑब्जेक्ट होगा जो getWritableDatabase() द्वारा लौटाएगा जब तक कि कोई समस्या, जैसे पूर्ण डिस्क, डेटाबेस को केवल पढ़ने के लिए खोलने की आवश्यकता होती है। उस स्थिति में, केवल-पढ़ने योग्य डेटाबेस ऑब्जेक्ट वापस कर दिया जाएगा। यदि समस्या ठीक हो गई है, तो प्राप्त करने के लिए भावी कॉल WitableDatabase() सफल हो सकता है, इस स्थिति में केवल-पढ़ने के लिए डेटाबेस ऑब्जेक्ट बंद हो जाएगा और पढ़ने/लिखने की वस्तु भविष्य में वापस आ जाएगी।

+0

तो मैं getWritableDatabase कहां कॉल करूं? क्या मुझे इसे अपने कन्स्ट्रक्टर में कॉल करना चाहिए? – tyczj

+0

जहां भी आप इसका उपयोग करने जा रहे हैं ... मैं सामान्य रूप से इसे अपने ContentProvider में उपयोग करता हूं लेकिन यदि आपके पास कोई नहीं है, तो यह आपके कोड में आसानी से चलना चाहिए, जहां भी आप एक डालने या अपडेट करने के लिए जा रहे हैं। योग्य डेटाबेस होना चाहिए कहा जाता है, यह इसके उपयोग को मजबूर करने के लिए necesary नहीं है। – Necronet

+0

@tyczj ~ "मैं कहां getWritableDatabase कहां कॉल करूं?" मुझे लगता है कि आप CRUD परिचालन करने के लिए SQLiteOpenHelper क्लास का उपयोग कर रहे हैं? उस स्थिति में जब आप अपने कोड में SQLiteOpenHelper का उदाहरण प्राप्त करते हैं तो आप getWritableDatabase() को कॉल करेंगे। –

1

मैं सुझाव है कि आप को बढ़ा देते DATABASE_VERSION एक के बाद, कि onUpgrade कॉल करने के लिए आवेदन का नेतृत्व करेंगे()

+0

मैं ने कहा कि मुझे लगता है कि किया था और यह फ्लॉप कुछ भी संपादित करना * मैं '1' से' 2' – tyczj

+0

करने के लिए बदल 'निजी स्थिर अंतिम पूर्णांक DATABASE_VERSION = 2' वहाँ LogCat में कोई अपवाद नहीं हैं? – prometheuspk

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