2012-07-20 14 views
22

मैं SQL कस्टम डेटाबेस के साथ संवाद करने के लिए अपने कस्टम ContentProvider का उपयोग कर रहा हूं। मैं एक सूची (सूचीफ्रेगमेंट का उपयोग करके) पर प्रदर्शित करना चाहता हूं, डेटा जो दो तालिकाओं से आता है (कई से कई संबंधों के साथ)। ऐसे मामले के लिए मैं एकमात्र समाधान सोच सकता हूं कच्चेQuery का उपयोग करना। और सवाल यह है कि, यदि यह एक अच्छा अभ्यास है, या मुझे इसे किसी अन्य तरीके से हल करना चाहिए? टेबल केक्या यह ContentProvider में rawQuery का उपयोग करने के लिए एक अच्छा अभ्यास है?

उदाहरण:

तालिका A: आईडी, COLUMN_FROM_A

टेबल बी: आईडी, COLUMN_FROM_B

में शामिल होने तालिका एबी: आईडी, FK_ID_A, FK_ID_B

ओवरराइड क्वेरी विधि का उदाहरण ContentProvider में:

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
    Cursor cursor = null; 
    int uriType = URIMatcher.match(uri); 
    switch (uriType) { 
     case TABLE_A_URI: 
      queryBuilder.setTables("TABLE_A"); 
      cursor = queryBuilder.query(databaseHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     case TABLE_B_URI: 
      queryBuilder.setTables("TABLE_B"); 
      cursor = queryBuilder.query(databaseHelper.getReadableDatabase(), projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     case TABLE_JOIN_A_B_URI: 
      cursor = databaseHelper.getReadableDatabase().rawQuery("select a.COLUMN_FORM_A, b.COLUMN_FROM_B from TABLE_A a, TABLE_B b, TABLE_AB ab where ab.FK_ID_A=a.ID and ab.FK_ID_B=b.ID", null); 
      break; 
     default: 
      throw new IllegalArgumentException("Unknown URI"); 
    } 

    cursor.setNotificationUri(getContext().getContentResolver(), uri); 
    return cursor; 
} 

उत्तर

12

यह अच्छा है और सामान्य अभ्यास, इस मामले में बहुत उपयुक्त है।

मुझे कोई समस्या नहीं है, हमने इसे कई ऐप्स में उपयोग किया है।

+1

एकमात्र बेहतर समाधान मैं सोच सकता हूं कि देशी एसक्यूएल के बिना इस क्वेरी (इस क्रॉस टेबल का उपयोग करके) लिखने का तरीका है लेकिन क्वेरीबिल्डर से क्वेरी विधि का उपयोग करना, जो कि मेरे उदाहरण में एकल टेबल के लिए उपयोग किया जाता है। मुझे अभी इस तरह के कार्यान्वयन नहीं मिला है और मुझे यकीन नहीं है कि यह भी संभव है। –

+1

उदाहरण के लिए, उदाहरण के लिए 'SQLiteQueryBuilder.setTables ("foo बाएं बाहरी जॉइन बार चालू (foo.id = bar.foo_id)") –

+1

उपरोक्त दोनों उत्तर मुझे बहुत संतुष्ट करते हैं। यह वही है जिसे मैं देख रहा था। धन्यवाद। –

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

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