मुझे ContentProvider के उप-वर्गों का उपयोग करके समाधान मिला। मान लें कि आपके पास टेबल tbla और एक और तालिका tblb है। मैं दो कक्षाओं "AcontentProvider" और "BContentProvider" बनाने की सलाह देते हैं। सबसे महत्वपूर्ण बात यह सुनिश्चित करें कि दोनों टेबल एक ही डेटाबेस में स्थापित हैं।
समाधान के मुख्य भाग ContentProvider है कि आप अपने CursorLoader से फोन करेगा में ContentProvider.query() ओवरराइड करने के लिए है - यूआरआई का फैसला करता है, जो एक यह है:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sort) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(
"tblA LEFT JOIN tblB"
+ " ON ("
+ "tblA.b_id"
+ " = "
+ "tblB.id"
+ ")"
);
...
// Content of projection is set by CursorLoader
// usually in an Activity that implements LoaderManager.LoaderCallbacks<>
Cursor c = qb.query(
database,
projection,
selection,
selectionArgs,
groupBy,
having,
orderBy
);
...
return c;
}
आप देख सकते हैं, जॉइन सेटटेबल्स में किया जाता है()।प्रक्षेपण का उपयोग करना आप सुनिश्चित करें कि आप केवल कॉलम आप वास्तव में जरूरत है प्रदर्शित करने के लिए और सभी के अधिकांश, आप कोई डुप्लिकेट कॉलम है, दोनों तालिकाओं से "आईडी" की तरह: ओवरराइड की
final String[] projection = new String[] {
"tblA.*",
"tblB.columnThatOnlyBHas"
};
उपयोग करें और करने की कोशिश उप-वर्गों में जितना संभव हो उतना काम करें; उदाहरण के लिए: मेरे सभी ओवरराइड क्वेरी() पद्धतियों setNotificationUri() फोन ContentResolver सूचित करने के लिए करता है, तो कर्सर परिणाम सेट परिवर्तन .:
c.setNotificationUri(getContext().getContentResolver(), uri);
मैं ऊपर, लेकिन में शामिल होने का उपयोग करने का मेरे मामले पूरे मुद्दे में अपना जवाब पढ़ स्तंभों को पुन: प्राप्त करने के लिए है एकाधिक संबंधित तालिका से केवल एक प्रश्न के साथ। कर्सर लोडर से प्राप्त होने वाले एक कर्सर के अंदर मुझे संपर्कों से DISPLAY_NAME_PRIMARY की आवश्यकता है। संपर्क तालिका, संपर्क से ACCOUNT_NAME संपर्क करें। संपर्क से संपर्क करें और डेटा से संपर्क करें। डेटा तालिका.अब मुझे समझ में नहीं आता कि कैसे उरी इस से मेरी सहायता कर सकती है क्योंकि अगर मैं उरी देता हूं तो ContactsContract.RawContact मेज की ओर इशारा करते मैं कैसे ContactsContract.Contact और ContactsContract.Data तालिका –
@AbhishekChauhan के संबंधी कॉलम का उपयोग करेंगे: ठीक है, आपके मामले में, आप 'ContentProvider', जिसका अर्थ है कि आप" यह नहीं हैक कर सकते हैं नहीं लिखा था किसी भी तरह सामग्री प्रदाता के अंदर rawSql के साथ ", जैसा कि आपने अपने प्रश्न में दावा किया था। मेरा उत्तर किसी ऐसे व्यक्ति के लिए है जो 'ContentProvider' लिख रहा है और इसलिए इसके अंदर शामिल हो सकता है। आपके मामले में, आपको अपने डेटा को मैन्युअल रूप से एकाधिक 'कर्सर' ऑब्जेक्ट्स से "जुड़ना" होगा, और 'लोडर' ढांचा इस क्षेत्र में ज्यादा मदद नहीं करेगा। कफ के बाहर, मैं 'AsyncTask' का उपयोग करता हूं, फिर' ContentResolver' का उपयोग करके क्वेरी करता हूं और 'डेटा में' डिनबैकग्राउंड() 'में अपना डेटा मर्ज करता हूं। – CommonsWare
या ... धन्यवाद, मैं इसके लिए asynctask का उपयोग करूंगा और बाद में विलय करूँगा ... यह मुझे बेहतर तरीके से उपयुक्त करेगा –