2012-10-31 14 views
6

मैंने एक एंड्रॉइड एप्लिकेशन बनाया है, यदि एप्लिकेशन का नया संस्करण है तो स्टार्टअप पर जांचें। यदि हां, तो एप्लिकेशन नई एपीके फ़ाइल डाउनलोड करें और नए एपीके को ओवर-इंस्टॉल करें। मेरा आवेदन sqlite डीबी का उपयोग करें। लेकिन यह डीबी, एक संस्करण से दूसरे संस्करण में बदल सकता है। मुझे लगता है कि मैं विधि का उपयोग करने के लिए है:ऑन अपग्रेड() एंड्रॉइड में स्क्लाइट डेटाबेस

onUpgrade() 

लेकिन मैं वास्तव में नहीं जानता कि यह कैसे उपयोग करने के लिए।

जब मैं (नहीं मौजूद है तो) मैं क्रेते डेटाबेस के लिए इस कोड का उपयोग आवेदन शुरू:

DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION) 

मैं क्या बदलना चाहिए अगर मैं onUpgrade() विधि का उपयोग करना चाहते हैं? और मुझे इसे कब कॉल करना है?

+1

संस्करण संख्या – njzk2

उत्तर

17

onUpgrade() कहा जाता है (यदि आप इसे अपने आप को फोन नहीं है) जब अपने DB का संस्करण बदल जिसका अर्थ है अंतर्निहित तालिका संरचना बदल आदि

सामान्य तौर पर इसका मतलब है कि ओएस आप कह रहा है "हे, आप डेटाबेस के लिए कहा संरचना संस्करण 10 लेकिन मुझे पता चला कि हमें यहां कुछ पुराना मिला है, इसलिए डेटाबेस का उपयोग करना शुरू करने से पहले यह तय करने का मौका है (और संरचना विसंगति के कारण संभावित रूप से क्रैश) "

उस विधि में आपको जो कुछ भी आवश्यक है, वह करना चाहिए .. मौजूदा संस्करण आवश्यकताओं को मिलान करने जैसे कॉलम जोड़ने/ड्रॉप करने, पंक्ति सामग्री को परिवर्तित करने या यहां तक ​​कि पुरानी डीबी को पूरी तरह से छोड़ने और इसे बनाने से बचाने के लिए अपने पुराने डेटाबेस की संरचना को अपग्रेड करना चाहिए। स्क्रैच - एंड्रॉइड के लिए इससे कोई फर्क नहीं पड़ता कि आप यहां क्या करते हैं - यह आवश्यक कोड (यदि कोई हो) करने के लिए आपके कोड के लिए आपातकालीन कॉलबैक का एक प्रकार है। आपको यह पता होना चाहिए कि उपयोगकर्ता अक्सर अपडेट नहीं हो सकते हैं, इसलिए आपको हमेशा संस्करण X से अपग्रेड करना होगा, यह जानकर कि एक्स i.e. (वाई -1) के बराबर नहीं हो सकता है।

+1

मुझे लगता है कि अपग्रेड दो int पैरामीटर लेते हैं: oldVersion और newVersion। तो अगर मेरे पास ऐप में है, तो संस्करण 1 पर डेटाबेस और डाउनलोड एपीके में संस्करण 2 पर डेटाबेस है, यह सिस्टम को स्वचालित रूप से अपग्रेड() विधि पर कॉल करने की अनुमति देता है? – GVillani82

+0

http://code.google.com/p/openintents/source/browse/trunk/notepad/NotePad/src/org/openintents/notepad/NotePadProvider.java?r=3878 में सुझाए गए सुझावों की तरह मैं स्विच का उपयोग कर सकता हूं (oldVersion) प्रत्येक पुराने संस्करण के लिए अलग-अलग बदलावों को ध्यान में रखते हुए? क्या यह सही है? इसके अलावा, यदि, एक नए डीबी संस्करण में, मैं कुछ तालिका में नया कॉलम जोड़ता हूं, तो मुझे नए अतिरिक्त कॉलम के साथ तालिका बनाने के लिए ऑनक्रेट को भी संशोधित करना होगा?यह संभवतः समझ में आता है कि कोई एप्लिकेशन अभी तक स्थापित नहीं है और नया डीबी बनाया जाना है। क्या मेरी धारणा सही है? – GVillani82

+2

हां। संस्करण संख्या सिर्फ 'int' है, इसलिए आप नियमित रूप से 'स्विच/केस' कर सकते हैं। हालांकि महत्वपूर्ण बात यह है कि आप उदाहरण के लिए संस्करण 2 से 3 तक अपग्रेड करना चाहते हैं, लेकिन 1 से 3 तक भी (मैं शायद वहां लूप करता हूं और पहले 1 से 2 तक अपग्रेड करता हूं, फिर 2 से 3 तक), जो शायद सीधे परिप्रेक्ष्य देने के लिए 1 से 3 (या 1 से 80 तक प्रत्यक्ष अपडेट को संभालने से सरल होना) –

4

यदि आप SQLiteOpenHelper का उपयोग कर रहे हैं तो ऑन अपग्रेड को जब भी आप डीबी संस्करण बदलते हैं तो कॉल किया जाएगा। इस के लिए काम करने के लिए एक अतिरिक्त आवश्यकता है। डीबी नाम वही रहता है।

Old Version: 
dbName = "mydb.db" 
dbVersion = 1 

New Version: 
dbName = "mydb.db" 
dbVersion = 2 

सामग्री प्रदाता के ऑनक्रेट में आप SQLiteOpenHelper का एक उदाहरण बनाते हैं जो इन पैराम को लेता है। आपका SQLiteOpenHelper कार्यान्वयन इस प्रकार दिखाई देगा:

public static final class MySQLiteOpenHelper extends SQLiteOpenHelper { 

     public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) { 
      super(context, dbName, null, dbVersion); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      //Code to create your db here 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // Code to upgrade your db here 
     } 

} 

यह भी कहा जाएगा, जब आप आप तालिका में परिवर्तन करने या अपने डेटाबेस में अधिक तालिकाओं जोड़ने

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); 
    } 
} 
पाया
संबंधित मुद्दे