मैं एंड्रॉइड एसक्यूएलएट नोटपैड ट्यूटोरियल पढ़ रहा था जो डीबी एडाप्टर क्लास को डीबी टेबल बनाने और एक्सेस करने के लिए संदर्भित करता था। एक बहु-टेबल SQLite डेटाबेस से निपटने पर, क्या प्रत्येक तालिका के लिए एक अलग एडाप्टर क्लास बनाने या पूरे एंड्रॉइड एप्लिकेशन के लिए एक एकल डीबी एडाप्टर क्लास बनाने का सबसे अच्छा अभ्यास है?एंड्रॉइड में एकाधिक टेबल SQLite डीबी एडाप्टर (ओं)?
मेरा एप्लिकेशन एकाधिक तालिकाओं का उपयोग करता है और मुझे आशा थी कि एक भी विशाल एडाप्टर क्लास न हो। हालांकि, समस्या यह है कि मेरे पास प्रत्येक एडाप्टर के भीतर नोटपैड उदाहरण के अनुसार SQLiteOpenHelper का घोंसला वाला सबक्लास है। जब पहली तालिका का उपयोग किया जाता है, तो सब कुछ ठीक काम करता है। जब मैं दूसरी टैब (एक अलग गतिविधि से) तक पहुंचने का प्रयास करता हूं तो मेरा ऐप दुर्घटनाग्रस्त हो जाता है।
पहले, मैंने सोचा था कि दुर्घटना संस्करण संस्करण के कारण हुई थी, लेकिन दोनों एडाप्टर के पास अब एक ही डेटाबेस संस्करण है और यह अभी भी क्रैश हो रहा है।
तालिका के लिए डीबी एडाप्टर में से एक का उदाहरण यहां दिया गया है। अन्य एडाप्टर सभी अलग-अलग कार्यान्वयन के साथ समान प्रारूप का पालन करते हैं।
public class InfoDBAdapter {
public static final String ROW_ID = "_id";
public static final String NAME = "name";
private static final String TAG = "InfoDbAdapter";
private static final String DATABASE_NAME = "myappdb";
private static final String DATABASE_TABLE = "usersinfo";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "create table usersinfo (_id integer primary key autoincrement, "
+ NAME
+ " TEXT," + ");";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " //$NON-NLS-1$//$NON-NLS-2$
+ newVersion + ", which will destroy all old data"); //$NON-NLS-1$
//db.execSQL("DROP TABLE IF EXISTS usersinfo"); //$NON-NLS-1$
onCreate(db);
}
}
public InfoDBAdapter(Context ctx) {
this.mCtx = ctx;
}
public InfoDBAdapter open() throws SQLException {
this.mDbHelper = new DatabaseHelper(this.mCtx);
this.mDb = this.mDbHelper.getWritableDatabase();
return this;
}
/**
* close return type: void
*/
public void close() {
this.mDbHelper.close();
}
public long createUser(String name) {
ContentValues initialValues = new ContentValues();
initialValues.put(NAME, name);
return this.mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteUser(long rowId) {
return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
}
public Cursor fetchAllUsers() {
return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID,
NAME}, null, null, null, null, null);
}
public Cursor fetchUser(long rowId) throws SQLException {
Cursor mCursor =
this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, NAME}, ROW_ID + "=" + rowId, null, //$NON-NLS-1$
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateUser(long rowId, String name) {
ContentValues args = new ContentValues();
args.put(NAME, name);
return this.mDb
.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
}
}
जब पहली एडाप्टर, इस मामले में userinfo, का उपयोग किया जाता है, सब कुछ अपेक्षित काम करता है। आइए मान लें कि मेरे पास दोस्त की जानकारी के लिए एक और एडाप्टर है जो ऊपर की तरह एक ही संरचना का पालन करता है, जब इसे किसी भिन्न गतिविधि से एक्सेस किया जाता है, तो मुझे लगता है कि SQLiteOpenHelper का नेस्टेड सबक्लास डेटाबेस को फिर से बनाने का प्रयास करेगा। जाहिर है कुछ गलत है क्योंकि उस परिदृश्य में, मेरा ऐप दुर्घटनाग्रस्त हो जाता है।
तो एंड्रॉइड के भीतर मानक तालिका प्रत्येक व्यक्तिगत एडाप्टर के बजाय एक एकल विशाल डीबी एडाप्टर बनाने के लिए है?
+1: मेरे आस-पास भी अपना मन पाने की कोशिश कर रहा है। केवल एक टेबल या दो होने के कारण, यह सब एक ही डीबी एडाप्टर वर्ग के अंदर डालने में कोई समस्या नहीं है। हालांकि, अगर डीबी कई तालिकाओं के साथ बढ़ता है, तो वह गन्दा हो जाएगा। तो वास्तव में दिलचस्पी है अगर कोई इस क्षेत्र में कुछ सर्वोत्तम प्रथाओं को इंगित कर सकता है। – Nailuj
यहां एक ही प्रश्न है लेकिन वास्तविक उत्तरों के साथ: http://stackoverflow.com/questions/3684678 – jcmcbeth