2010-11-20 29 views
18

मेरा ऐप दो डेटाबेस (अलग फाइलें) का उपयोग करता है। इन डेटाबेस को संभालने के लिए मैंने दो सहायक वर्ग बनाए हैं जो SQLiteOpenHelper का विस्तार करते हैं, प्रत्येक डेटाबेस के लिए एक।एंड्रॉइड: क्या मैं एकाधिक डेटाबेस फ़ाइलों के लिए एक SQLiteOpenHelper क्लास का उपयोग कर सकता हूं?

अब मैं एक तीसरा डेटाबेस जोड़ने जा रहा हूं और आश्चर्य करता हूं कि मुझे अभी तक एक और हेल्पर क्लास बनाने की आवश्यकता है (और यदि मैंने 4 वें और 5 वें डेटाबेस का उपयोग किया तो मुझे और भी सहायक वर्ग की आवश्यकता होगी), या मैं इसका उपयोग कर सकता हूं कई डेटाबेस के लिए सहायक वर्ग?

समस्या जो मैं केवल एक हेल्पर कक्षा का उपयोग करने की कोशिश कर रहा हूं वह यह है कि मैं नहीं देख सकता कि व्यक्तिगत डेटाबेस फ़ाइलों का नाम हेल्पर को कैसे पास किया जाए। वर्तमान में डेटाबेस का नाम प्रत्येक सहायक वर्गों के एक स्थिर क्षेत्र के रूप में हार्ड-कोड किया गया है, लेकिन अगर मेरे पास केवल एक सहायक वर्ग था तो मुझे अलग हेल्पर बनाने के दौरान कन्स्ट्रक्टर में अलग-अलग नामों को पारित करने में सक्षम होना होगा वस्तुओं; समस्या यह है कि SQLiteOpenHelper कन्स्ट्रक्टर को केवल एक पैरामीटर के साथ एंड्रॉइड द्वारा बुलाया जाता है: संदर्भ।

+0

अरे यार! मैं आपसे बहुत कुछ कर रहा हूं, लेकिन मेरे मामले में मुझे 2 अलग-अलग डीबी हेल्पर कक्षाओं की आवश्यकता है। ऐसा करने की कोशिश करते समय मुझे एक त्रुटि मिल रही है। java.lang.IllegalStateException: हेल्पर क्लास कक्षा एक्स थी लेकिन कक्षा वाई पर रीसेट करने की कोशिश कर रहा है क्या आपने कभी इस मुद्दे का सामना किया है? – Ajay

उत्तर

16

बेशक, आप कर सकते हैं। यह सिर्फ आपके हेल्पर क्लास डिजाइन का मामला है। तुम बस hardcoding के बजाय (आवश्यक Context उदाहरण के साथ) अपने सहायक वर्ग निर्माता के लिए डीबी के नाम से पारित कर सकते हैं:

public class DBOpenHelper extends SQLiteOpenHelper { 

    public DBOpenHelper(Context context, String dbName, int dbVersion) { 
     super(context, dbName, null, dbVersion); 
    } 
... 
} 
+0

मुझे मूर्खतापूर्ण! मैं अपने हेल्पर ऑब्जेक्ट कोड निर्माण कोड को सही ढंग से नहीं पढ़ रहा था। जैसा कि आप कहते हैं, यह बहुत आसान है। – prepbgg

+0

हाय, मैं एक प्रश्न पूछना चाहता हूं (उम्मीद है कि यह बहुत आसान/स्पष्ट नहीं है) यह है कि आप सभी डेटाबेस बनाने के लिए सहायक वर्ग के माध्यम से कैसे पुन: प्रयास करते हैं? क्या आपने उन डेटाबेसों की संख्या के लिए लूप का उपयोग करके सहायक वर्ग के माध्यम से लूप किया था जिसे आप बनाना चाहते हैं और सभी डेटाबेस नामों में पास करना चाहते हैं? – jamen

2

आपको एक सारणी कक्षा की आवश्यकता है जो यहां वर्णित अपग्रेड प्रक्रिया लागू करता है। फिर आप अपनी प्रत्येक सारणी के लिए इस अमूर्त वर्ग का विस्तार करते हैं। आपके सारणी वर्ग में आपको टेबल को एक तरह से स्टोर करना होगा (सूची, हार्डकोडेड) ताकि ऑन अपग्रेड आपको टेबल आइटम्स पर फिर से सक्रिय करे और प्रत्येक तालिका आइटम के लिए आप वर्णित चरणों को करें। वे अपने सभी मौजूदा विवरणों को रखते हुए स्वयं को अपग्रेड कर देंगे। कृपया ध्यान दें कि ऑन अपग्रेड इवेंट प्रति डेटाबेस केवल एक बार आग लग जाता है, यही कारण है कि आप सभी को अपग्रेड करने के लिए अपने सभी टेबलों पर फिर से प्रयास करने की आवश्यकता है। आप सभी डेटाबेस पर केवल 1 संस्करण संख्या बनाए रखते हैं।

  • beginTransaction
  • रन if not exists के साथ एक मेज सृजन (हम एक उन्नत कर रहे हैं, तो तालिका अभी तक मौजूद नहीं हो सकता है, यह परिवर्तन और ड्रॉप असफल हो जायेगी) वर्तमान कॉलम एक सूची में
  • डाल List<String> columns = DBUtils.GetColumns(db, TableName);
  • बैकअप तालिका (ALTER table " + TableName + " RENAME TO 'temp_" + TableName)
  • नई तालिका (सबसे नया तालिका बनाने स्कीमा) बनाने
  • नए कॉलम के साथ चौराहे मिलता है, इस समय कॉलम ले n उन्नत बनाया मेज से (columns.retainAll(DBUtils.GetColumns(db, TableName));)
  • डेटा (String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
  • निकालें बैकअप तालिका (DROP table 'temp_" + TableName)
  • setTransactionSuccessful

(यह प्रबंधन नहीं करती है तालिका ढाल, बहाल यदि आप एक स्तंभ का नाम बदलने , आपको मौजूदा डेटा ट्रांसफर नहीं किया जाता है क्योंकि कॉलम नाम मेल नहीं खाते हैं)।

public static List<String> GetColumns(SQLiteDatabase db, String tableName) { 
    List<String> ar = null; 
    Cursor c = null; 
    try { 
     c = db.rawQuery("select * from " + tableName + " limit 1", null); 
     if (c != null) { 
      ar = new ArrayList<String>(Arrays.asList(c.getColumnNames())); 
     } 
    } catch (Exception e) { 
     Log.v(tableName, e.getMessage(), e); 
     e.printStackTrace(); 
    } finally { 
     if (c != null) 
      c.close(); 
    } 
    return ar; 
} 

public static String join(List<String> list, String delim) { 
    StringBuilder buf = new StringBuilder(); 
    int num = list.size(); 
    for (int i = 0; i < num; i++) { 
     if (i != 0) 
      buf.append(delim); 
     buf.append((String) list.get(i)); 
    } 
    return buf.toString(); 
} 
+0

मुझे डर है कि यह मेरे लिए बहुत जटिल है! शायद मुझे कई डेटाबेस के लिए कई हेल्पर कक्षाओं के साथ रहना चाहिए। – prepbgg

+0

आपके पास सभी जटिल कोड टुकड़े हैं। आपको सिर्फ चक्र के लिए लपेटना होगा और लेन-देन की चीजों को लपेटना होगा। इससे अधिक जटिल चीजें हैं। – Pentium10

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

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