2012-12-14 15 views
19

क्या यह एक बड़ा SQLiteOpenHelper उप-वर्ग होना बेहतर है जो डेटाबेस में प्रत्येक तालिका के लिए onCreate और onUpgrade विधियों को परिभाषित करता है, या प्रत्येक तालिका के लिए SQLiteOpenHelper उप-वर्गों के लिए बेहतर है?डेटाबेस में प्रत्येक तालिका के लिए एक SQLiteOpenHelper होना चाहिए?

क्या कोई सर्वोत्तम अभ्यास है? या दोनों स्वीकार्य हैं, लेकिन विभिन्न अच्छे और बुरे दुष्प्रभावों के साथ?

उत्तर

24

आपके पास सभी तालिकाओं के लिए एक एकल SQLiteOpenHelper क्लास होना चाहिए। this लिंक देखें।

+0

ठीक, धन्यवाद के साथ एक existin डेटाबेस है, तो आप प्रत्येक के लिए एक होने के sideeffect जानते हो तालिका? या केवल एक फ़ाइल को संपादित करने के लिए है? –

+1

संपादित उत्तर की जांच करें –

+1

धन्यवाद यह काफी व्याख्यात्मक है, मैं asap पढ़ूंगा! : डी: डी –

4
बस एक अलग दृष्टिकोण की खातिर

:

तुम हमेशा onOpen(..) पद्धति पर overried कर सकते हैं इसे अपने onCreate(..) कहा जाता है। बल्कि "CREATE TABLE"

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

@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_FRIENDS_TABLE = "CREATE TABLE IF NOT EXISTS ..."; 
    db.execSQL(CREATE_FRIENDS_TABLE); 
} 

आपको लगता है कि हर वर्ग कि SQLiteOpenHelper

तक फैली हुई है साथ
1

@TheReader सही है की तुलना में "CREATE TABLE IF NOT EXISTS..." बयान का उपयोग सुनिश्चित करें। मैं सभी तालिकाओं के लिए एक एकल SQLiteOpenHelper पसंद करता हूं, यहां मैं जो करता हूं: SQLiteOpenHelper subClass के निर्माता को "टेबल निर्माण" वर्गों की एक सूची पास करें, फिर ऑनक्रेट फ़ंक्शन में प्रत्येक तालिका बनाने के लिए सूची को पुन: सक्रिय करें। तो मेरे SQLiteOpenHelper उपवर्ग इस तरह sth दिखता है:

public ModelReaderDbHelper(Context context, List<String> createSQLs, List<String> deleteSQLs){ 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.TABLE_CREATION_SQLS = createSQLs; 
     this.TABLE_DELETE_SQLS = deleteSQLs; 
    } 
    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 
     for(String oneCreation : TABLE_CREATION_SQLS){ 
      sqLiteDatabase.execSQL(oneCreation); 
     } 
    } 

लेकिन वह एक और समस्या आता है: एक नई तालिका जोड़ने के बाद, और स्थापित एक मौजूदा वर्ष एक के साथ एप्लिकेशन का नया संस्करण स्थापित करते हैं, नई तालिका नहीं होगा बनाया जाना चाहिए, क्योंकि पुराने डेटाबेस का अस्तित्व ऑनक्रेट फ़ंक्शन को कॉल करने से रोक देगा। तो उपयोगकर्ता को पहले ऐप को अनइंस्टॉल करना होगा, और ऐप को पूरी तरह इंस्टॉल करना होगा। DATABASE_VERSION मदद करता है, यह एंड्रॉयड onCreate समारोह पर अमल नहीं होगा लगते हैं तभी एक ही नाम और एक ही DATABASE_VERSION

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