2011-03-04 3 views
9

मैं अपने ऐप के SQLite डीबी में एक टेबल जोड़ रहा हूं। मेरा सभी वाक्यविन्यास ठीक है, मुद्दा नहीं। लेकिन मुझे नई टेबल को ठीक तरह से बनाने में कुछ परेशानी हो रही है। मैंने नई टेबल जोड़ा ....SQLite डेटाबेस को कैसे अपडेट करें और सभी मौजूदा डेटा खोना नहीं है?

@Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(DATABASE_CREATE); 
      db.execSQL(CREATE_REQUESTS); 
      db.execSQL(CREATE_OVERRIDE); 
     } 

मेरा निर्माण विधि पर। मेरे पास 3 टेबल हैं। जब मैंने संस्करण संख्या को अपडेट किया, तो मुझे एक त्रुटि मिली "तालिका अनुरोध (CREATE_REQUESTS का जिक्र करना) पहले से ही बनाया जा चुका है।" मेरी onUpgrade विधि पर एक नजर ...

@Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS contacts"); 
      onCreate(db); 
     } 

मुझे नेतृत्व में समझना महत्वपूर्ण है कि लाइन db.execSQL("DROP TABLE IF EXISTS contacts"), जो onCreate विधि में मेरी DATABASE_CREATE तालिका को संदर्भित करता है, पुराने मेज, तो अगली पंक्ति, onCreate(db); ड्रॉप करने के लिए इस्तेमाल किया जाता है इसे दोबारा शुरू करता है मैंने उस execSQL लाइन में अनुरोध नहीं जोड़े, जो त्रुटि के कारण हुआ। यहां मुद्दा है: मैं पहले से मौजूद दो तालिकाओं में डेटा खोना नहीं चाहूंगा। क्या कोई टेबल जोड़ने का कोई तरीका है जैसे मैं करने की कोशिश कर रहा हूं, और सभी पुराने डेटा को खोना नहीं है? धन्यवाद।

उत्तर

12

आप onUpgrade में जो कुछ भी चाहते हैं वह कर सकते हैं। आप अपनी तालिका में नए कॉलम जोड़ने के लिए ALTER का उपयोग कर सकते हैं।

सबसे खराब स्थिति, यदि आपकी स्कीमा पूरी तरह से और पूरी तरह से अलग है, तो आपको नई तालिका बनाना होगा, पुरानी तालिका से डेटा का उपयोग करके इसे पॉप्युलेट करना होगा, और फिर पुरानी तालिका को हटा दें।

किसी भी मामले में, onUpgrade को डेटा के किसी भी नुकसान के बिना चिकनी अपग्रेड की अनुमति देने के लिए डिज़ाइन किया गया था। यह ठीक से लागू करने के लिए आप पर निर्भर है।

+0

हम्म स्थापित ठीक ठीक काम करता है। मुझे लगता है कि मेरी चिंता यह है कि अगर आपने इसे अपग्रेड में किया है तो यह तब नहीं होगा जब कोई ऐप का उपयोग स्क्रैच से करता है, लेकिन मुझे लगता है कि जब तक मैं इसे ऑन्रेट विधि में डालता हूं तो भी इसका कोई बड़ा सौदा नहीं होता है। धन्यवाद! – JMRboosties

+0

ऑन अपग्रेड केवल तभी बुलाया जाता है जब कोई मौजूदा ऐप अपग्रेड हो। यदि आप ऐप को स्क्रैच से शुरू करते हैं, तो आपको केवल क्रिएट पर कॉल प्राप्त होगा। – EboMike

+4

इसका केवल तभी कॉल किया जाता है जब आप डेटाबेस संस्करण को बढ़ाते हैं। –

0

अगर डीबी संस्करण: 6

Ex : There is a table with 5 columns 

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

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;"; 

उपरोक्त दो ऑपरेशन के बाद कहीं भी होगी ताजा के लिए, उपयोगकर्ता और एप्लिकेशन उन्नयन उपयोगकर्ता

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