2012-09-03 20 views
10

मैं डेटाबेस एप्लिकेशन बना रहा हूं, और मेरा प्रोग्राम काम करता है और मैंने जो ट्यूटोरियल अनुसरण किया है, मैंने उसे समझा है। हालांकि, एक पहलू मेरे लिए अस्पष्ट है।SQLiteOpenHelper - डेटाबेस कैसे बनाया गया है?

SQLDOpenHelper को विस्तारित MyDBHelper का एक आंतरिक वर्ग है। बाहरी चरों में SQLiteDatabase नामक डी शामिल है। MyDBHelper के लिए कोड है:

private static class MyDBHelper extends SQLiteOpenHelper { 
     MyDBHelper(Context c) { 
      super(c, DB_NAME, null, DB_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      try { 
       db.execSQL(DATABASE_CREATE); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

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

मेरा प्रश्न यह है कि यह वास्तव में प्रारंभिक डेटाबेस कैसे बनाता है। यह ऑनक्रेट() विधि में होता है, लेकिन जहां तक ​​मैं देख सकता हूं, यह कभी भी कहा जाता है। मैं समझता हूं कि डेटाबेस को पहली बार बनाया गया है, लेकिन कहां? और इसके अलावा, यह SQLiteDatabase डीबी कैसे पारित किया जाता है? मैंने विधि में कोई डेटाबेस नहीं पारित किया है। और बनाया गया डेटाबेस में बाहरी वर्ग से मेरा SQLiteDatabase डीबी चर कैसे है? क्या कोई मुझे बेवकूफ की तरह इस बारे में बात कर सकता है?

उत्तर

7

onCreate() और onUpgrade() विधियों को वास्तव में पहली बार कहा जाता है जब डीबी बनाया जाता है। तथ्यों में, SQLiteOpenHelper के getReadableDatabase() or getWritebleDatabase() विधियों में इसकी जांच की गई है। यह जांच करेगा कि डेटा निर्देशिका पर डीबी पहले से मौजूद है या नहीं और यह संस्करण क्या है। इसके अनुसार यह या तो onCreate(), or onUpgrade() पर कॉल करेगा। या कुछ नहीं, अगर डीबी फाइल मौजूद है और सही संस्करण है।

आप myDBHelper.getReadable(Writable)Database() निष्पादित करने के लिए अपना कोड खोज सकते हैं। यही वह समय है जब यह चेक किया जाएगा।

कृपया मुझे बताएं कि अधिक जानकारी की आवश्यकता है या नहीं। गुड लक

0

शायद, getReadableDatabase() में या getWriteableDatabase() जब वे पहली बार के लिए कहा जाता है


3

ध्यान रखें कि आप SQLiteOpenHelper बढ़ा रहे हैं रखें, जादू के सभी इस सुपर वर्ग में होता है, विशेष रूप से डेटाबेस है प्रारंभ में बनाया गया (या फिर पुनः खोला गया) जब आप getReadableDatabase() या getWritableDatabase() पर कॉल करते हैं। इन दोनों तरीकों:

  • प्रारंभ db अपने onCreate(db) विधि कॉल करने या मौजूदा डेटाबेस को खोलने के द्वारा SQLiteDatabase db चर (और नियंत्रण अपने कॉलबैक तरीकों के db गुजर) को परिभाषित करें
  • संस्करण संख्या की जाँच करें और अपने onUpgrade(db) फोन onConfigure(db) की तरह या onDowngrade(db) यदि आवश्यक हो तो

उन्होंने यह भी कहते हैं कुछ और कॉलबैक तरीकों, onOpen(db), इत्यादि। (Read more इन तरीकों के बारे में।) यदि यह मदद करेगा, तो आप यह समझने के लिए the source code के माध्यम से पढ़ सकते हैं कि यह कैसे और कब होता है।

1

ऑनक्रेट() विधि इस कक्षा के लिए एक निर्माता नहीं है। जब आप डीबी बनाते हैं तो क्रिएट को बुलाया जाता है।

यहां पीपुल्सडीबी SQLiteOpenHelper को बढ़ाता है।इस कोड को एक अलग वर्ग से है और onCreate जब getWritableDatabase() या getReadableDatabase(), या एक तरह से कुछ भी

PeopleDB db = null; //onCreate NOT called here 
    db=new PeopleDB(getContext()); 
    db.getWritableDatabase(); //onCreate is called here! 

आशा कहा जाता है कि मदद करता है कहा जाता है।

1

हमारे डेटाबेस को ओपनहेपर के निर्माता में ही बनाया गया है, जिसे ओवरराइड ऑनक्रेट विधि में नहीं बनाया गया है। ऑनक्रेट विधि के अंदर हम डाटाबेस बनाने में डेटा डालने के लिए खुले सहायक के कन्स्ट्रक्टर में बनाए गए डेटाबेस में एक टेबल बनाने के लिए एक क्वेरी फायर कर रहे हैं।

एक और बात SQLiteDatabase ऑब्जेक्ट SQLiteOpenHelper क्लास में तत्काल नहीं है। यह कक्षा में तत्काल है जहां आप डीबी ऑपरेशंस करने के लिए डेटाबेस का उपयोग करना चाहते हैं और वहां आपको प्रविष्टि के लिए तैयार होने के लिए अपने डेटाबेस को घुमाने या खोलने के लिए इस तरह का एक फ़ंक्शन लिखना होगा।

SQLiteDatabase database; 

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that 

    public void open() throws SQLException { 
      database = profiloHelper.getWritableDatabase(); 
     } 

यहाँ कोड आप प्रविष्टि विलोपन कुछ भी की तरह डेटाबेस में किसी भी ऑपरेशन के लिए लिखने के लिए है, तो आप सिर्फ क्वेरी के

SQLiteStatement insert_stmt = null; 

     try { 
      insert_stmt = database.compileStatement(YOUR_QUERY); 

      insert_stmt.bindString(1, field1); 
      insert_stmt.bindString(2, field2); 
      insert_stmt.executeInsert(); 
     } 
     finally { 
      if (insert_stmt != null) insert_stmt.close(); 
     } 
0

आप एक उपवर्ग को लागू करने OnCreate (SQLiteDatabase) बनाने बदलना होगा, onUpgrade (SQLiteDatabase, int, int) और वैकल्पिक रूप से ओपन (SQLiteDatabase) पर, और यह कक्षा डेटाबेस खोलने का ख्याल रखती है, यदि यह मौजूद है, तो इसे बनाने के लिए, और इसे आवश्यकतानुसार अपग्रेड करना। (एंड्रॉइड डेवलपर वेबसाइट)

0

कक्षा SQLiteOpenHelper को अच्छे कारण के लिए "हेल्पर" कहा जाता है। यह हमें ऐप लेखकों को काफी प्रयास बचाता है।

पहली बार कि आप SQLiteOpenHelper के अपने कार्यान्वयन के लिए getWritableDatabase (या getReadableDatabase) कहते हैं, अपने निर्माता में अपने super बयान वर्तमान Context और डेटाबेस NAME कि आप SQLiteOpenHelper के लिए सुपर क्लास निर्माता करना पसंद करते हैं गुजरता है।

सुपरक्लास कन्स्ट्रक्टर तब आपके SQLiteDatabase के लिए प्रारंभिक स्थान सेट करता है और इसे super के माध्यम से पारित किया गया नाम निर्दिष्ट करता है।

समाप्त होने पर, सुपरक्लास कन्स्ट्रक्टर onCreate पर कॉल करता है और SQLiteDatabase नामित करता है जिसे यह onCreate के पैरामीटर के माध्यम से बनाया गया है। चूंकि onCreate केवल इसे एक बार कहा जाता है, इसलिए यह आपके डेटाबेस की संरचना को परिभाषित करने के लिए execSQL पर कॉल करने के लिए एक बहुत अच्छी जगह है।

getReadableDatabase (या getWritableDatabase) के बाद के निष्पादन केवल आपके लिए डेटाबेस खोलें और कभी भी onCreate पर कॉल न करें। (जब सुपर क्लास निर्माता लिखते हैं कि super एक अलग संस्करण संख्या भेजा है, onUpgrade Calle है।)

रास्ता SQLiteOpenHelper समझना स्पष्ट कोड और कैसे हो onCreate "नीले से बाहर" एक तर्क पारित हो गया था के बिना एक डेटाबेस बनाता है मेरे लिए एक असली कोर। अब मैं विश्वास नहीं कर सकता कि यह कभी कठिन हो सकता था।

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