अब अगर मैं एक और तालिका क्वेरी करने के लिए चाहता था, की सुविधा देता है Nodo कहता हूँ, मैं ContentProvider कैसे बदल जाएगा?
एक नया टेबल का पता कर रहा मतलब यह होगा कि आप एक नया Uri
जोड़ने की जरूरत है के बाद से Uri
डेटा स्रोत, एक अलग तालिका का उपयोग करने के लिए इसी तरह की चयन करता है।
आप अनिवार्य रूप से सभी हार्डकोडेड मान जोड़ रहे होंगे जो आपकी अन्य तालिका के लिए पहले से ही टोडोस के लिए हैं। उदाहरण के लिए:
// ------- usually the same for all
private static final String AUTHORITY = "de.vogella.android.todos.contentprovider";
// ------- define some Uris
private static final String PATH_TODOS = "todos";
private static final String PATH_REMINDERS = "reminders";
public static final Uri CONTENT_URI_TODOS = Uri.parse("content://" + AUTHORITY
+ "/" + PATH_TODOS);
public static final Uri CONTENT_URI_REMINDERS = Uri.parse("content://" + AUTHORITY
+ "/" + PATH_REMINDERS);
// ------- maybe also define CONTENT_TYPE for each
// ------- setup UriMatcher
private static final int TODOS = 10;
private static final int TODO_ID = 20;
private static final int REMINDERS = 30;
private static final int REMINDERS_ID = 40;
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, PATH_TODOS, TODOS);
sURIMatcher.addURI(AUTHORITY, PATH_TODOS + "/#", TODO_ID);
sURIMatcher.addURI(AUTHORITY, PATH_REMINDERS, REMINDERS);
sURIMatcher.addURI(AUTHORITY, PATH_REMINDERS + "/#", REMINDERS_ID);
}
//@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// Using SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case TODO_ID:
// Adding the ID to the original query
queryBuilder.appendWhere(TodoTable.COLUMN_ID + "="
+ uri.getLastPathSegment());
//$FALL-THROUGH$
case TODOS:
queryBuilder.setTables(TodoTable.TABLE_TODO);
break;
case REMINDERS_ID:
// Adding the ID to the original query
queryBuilder.appendWhere(ReminderTable.COLUMN_ID + "="
+ uri.getLastPathSegment());
//$FALL-THROUGH$
case REMINDERS:
queryBuilder.setTables(ReminderTable.TABLE_REMINDER);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
मैं queryBuilder.setTables (स्ट्रिंग inTables) में किसी भी तरह की मेज के नाम संलग्न करना चाहिए?
हां, यदि विभिन्न Uri
अलग-अलग तालिकाओं से पढ़े गए हैं तो यूरी मैच के आधार पर तालिका सेट करें।
CONTENT_TYPE और CONTENT_ITEM_TYPE के बारे में क्या, प्रत्येक तालिका के लिए एक होना चाहिए?
वास्तविक सामग्री प्रकार पर निर्भर करता है। यदि वे अलग हैं और आपको एक प्रकार की हां की आवश्यकता है। लेकिन आपको उन्हें बिल्कुल रखने की ज़रूरत नहीं है। वह उदाहरण उन्हें परिभाषित करता है लेकिन उनका उपयोग भी नहीं करता है। इसे getType
में टाइप करने की आवश्यकता होगी, documentation देखें।
TODO और TODO_ID varibles और क्वेरी विधि में स्विच के बारे में क्या है?
उन UriMatcher
जो अच्छी तरह से समझाया गया है here के लिए परिभाषित स्थिरांक हैं। यह मूल रूप से स्ट्रिंग मिलान के लिए एक सरलीकरण है। एक बड़ा ContentProvider
में 100 अलग-अलग यूरी हो सकते हैं और query
में सही तालिका का चयन करना दर्दनाक होगा यदि आपको if (uri.getPath().equals("todos") { /* code */ } else if (uri..
लिखना होगा।
1. setTables ... यह अपनी आवश्यकताओं पर निर्भर करता है मैप करने के लिए यदि आप में शामिल होने के लिए आपको लेकिन अभी भी बात की जरूरत है 2 ... 2. सामग्री माइम ... हाँ 3. फिर से प्रत्येक टेबल के लिए। 4. गलत रास्ता ... नहीं, मुझे लगता है कि एक अच्छा रास्ता ... आप किसी प्रकार के जनरेटर fx को खोजने/लिखने का प्रयास कर सकते हैं http://selvin.pl/autocontent.zip <= इसकी मेरा लेकिन यह अभी तक समर्थन विचार नहीं है केवल टेबल्स – Selvin