किसी को भी कैसे एक-से-कई SQLite
के लिए मैपिंग लागू करने के लिए ContentProvider
के प्रयोग पर अच्छा सलाह है? यदि आप Uri ContentProvider#insert(Uri, ContentValues)
देखते हैं तो आप देख सकते हैं कि इसमें ContentValues
पैरा है जिसमें सम्मिलित करने के लिए डेटा शामिल है। समस्या यह है कि वर्तमान कार्यान्वयन में ContentValues
put(String, Object)
विधि का समर्थन नहीं करता है और कक्षा अंतिम है इसलिए मैं इसे विस्तारित नहीं कर सकता। यह एक समस्या क्यों है? यहाँ मेरी डिजाइन आता है:एंड्रॉयड: SQLite एक-से-कई डिजाइन
2 टेबल जो एक-से-अनेक संबंध में हैं। कोड में इन्हें प्रस्तुत करने के लिए मेरे पास 2 मॉडल ऑब्जेक्ट्स हैं। पहला मुख्य रिकॉर्ड का प्रतिनिधित्व करता है और इसमें एक ऐसा क्षेत्र है जो दूसरे ऑब्जेक्ट उदाहरणों की एक सूची है। अब मेरे पास मॉडल ऑब्जेक्ट # 1 में एक सहायक विधि है जो वर्तमान ऑब्जेक्ट से उत्पन्न ContentValues
लौटाती है। ContentValues#put
ओवरलोडेड विधियों के साथ एक आदिम फ़ील्ड को पॉप्युलेट करना मुश्किल है लेकिन मैं सूची के लिए भाग्य से बाहर हूं। तो वर्तमान में मेरी दूसरी तालिका पंक्ति केवल एक स्ट्रिंग मान है क्योंकि मैं एक अल्पविराम सीमित स्ट्रिंग उत्पन्न करता हूं जो तब मैं ContentProvider#insert
के अंदर स्ट्रिंग [] को दोहराता हूं। यह भाग्यशाली लगता है, तो शायद कोई संकेत दे सकता है कि इसे क्लीनर फैशन में कैसे किया जा सकता है।
यहाँ कुछ कोड है। मॉडल कक्षा से पहले:
public ContentValues toContentValues() {
ContentValues values = new ContentValues();
values.put(ITEM_ID, itemId);
values.put(NAME, name);
values.put(TYPES, concat(types));
return values;
}
private String concat(String[] values) { /* trivial */}
और यहाँ ContentProvider#insert
विधि
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
try {
// populate types
String[] types = ((String)values.get(Offer.TYPES)).split("|");
// we no longer need it
values.remove(Offer.TYPES);
// first insert row into OFFERS
final long rowId = db.insert("offers", Offer.NAME, values);
if (rowId > 0 && types != null) {
// now insert all types for the row
for (String t : types) {
ContentValues type = new ContentValues(8);
type.put(Offer.OFFER_ID, rowId);
type.put(Offer.TYPE, t);
// insert values into second table
db.insert("types", Offer.TYPE, type);
}
}
db.setTransactionSuccessful();
return ContentUris.withAppendedId(Offer.CONTENT_URI, rowId);
} catch (Exception e) {
Log.e(TAG, "Failed to insert record", e);
} finally {
db.endTransaction();
}
}
हाँ, मैं एक ही समस्या है ... एक लेन-देन में अनेक निवेशन ने लिफाफे में कैसे? मैंने दो विशेष यूआरआई जोड़कर इसे प्रबंधित किया: एक संक्रमण की शुरुआत के लिए और अंत में एक। मुझे पता है कि यह सबसे अच्छा समाधान नहीं है। यदि आपके पास बेहतर है तो मैं इसकी सराहना करूंगा! – Bhiefer