Android
सामग्री प्रदाता
खोज…
टिप्पणियों
सामग्री प्रदाता डेटा के एक संरचित सेट तक पहुंच का प्रबंधन करते हैं। वे डेटा को संक्षिप्त करते हैं, और डेटा सुरक्षा को परिभाषित करने के लिए तंत्र प्रदान करते हैं। सामग्री प्रदाता मानक इंटरफ़ेस हैं जो एक प्रक्रिया में किसी अन्य प्रक्रिया में चल रहे कोड के साथ डेटा को जोड़ता है।
जब आप किसी सामग्री प्रदाता में डेटा एक्सेस करना चाहते हैं, तो आप क्लाइंट के रूप में प्रदाता के साथ संवाद करने के लिए अपने एप्लिकेशन के Context
में ContentResolver
ऑब्जेक्ट का उपयोग करते हैं। ContentResolver
ऑब्जेक्ट प्रदाता ऑब्जेक्ट के साथ संचार करता है, एक वर्ग का एक उदाहरण जो ContentProvider
लागू ContentProvider
। प्रदाता ऑब्जेक्ट ग्राहकों से डेटा अनुरोध प्राप्त करता है, अनुरोधित कार्रवाई करता है, और परिणाम लौटाता है।
यदि आपको अपना डेटा अन्य एप्लिकेशन के साथ साझा करने का इरादा नहीं है, तो आपको अपना प्रदाता विकसित करने की आवश्यकता नहीं है। हालाँकि, आपको अपने स्वयं के अनुप्रयोग में कस्टम खोज सुझाव प्रदान करने के लिए अपने स्वयं के प्रदाता की आवश्यकता होती है। यदि आपको अपने एप्लिकेशन से अन्य एप्लिकेशन में जटिल डेटा या फ़ाइलों को कॉपी और पेस्ट करना है, तो आपको अपने स्वयं के प्रदाता की भी आवश्यकता है।
एंड्रॉइड में स्वयं सामग्री प्रदाता शामिल होते हैं जो ऑडियो, वीडियो, चित्र और व्यक्तिगत संपर्क जानकारी जैसे डेटा का प्रबंधन करते हैं। आप उनमें से कुछ को android.provider
पैकेज के लिए संदर्भ प्रलेखन में सूचीबद्ध देख सकते हैं। कुछ प्रतिबंधों के साथ, ये प्रदाता किसी भी Android एप्लिकेशन के लिए सुलभ हैं।
एक बुनियादी सामग्री प्रदाता वर्ग को लागू करना
1) एक अनुबंध वर्ग बनाएँ
एक अनुबंध वर्ग उन स्थिरांक को परिभाषित करता है जो अनुप्रयोगों को सामग्री यूआरआई, कॉलम नाम, इरादे कार्रवाई और सामग्री प्रदाता की अन्य विशेषताओं के साथ काम करने में मदद करते हैं। एक प्रदाता के साथ अनुबंध कक्षाएं स्वचालित रूप से शामिल नहीं हैं; प्रदाता के डेवलपर को उन्हें परिभाषित करना होगा और फिर उन्हें अन्य डेवलपर्स के लिए उपलब्ध कराना होगा।
एक प्रदाता के पास आमतौर पर एक एकल प्राधिकरण होता है, जो उसके एंड्रॉइड-आंतरिक नाम के रूप में कार्य करता है। अन्य प्रदाताओं के साथ संघर्ष से बचने के लिए, एक अद्वितीय सामग्री प्राधिकरण का उपयोग करें। क्योंकि यह सिफारिश एंड्रॉइड पैकेज नामों के लिए भी सही है, आप प्रदाता के पैकेज के नाम के विस्तार के रूप में अपने प्रदाता प्राधिकरण को परिभाषित कर सकते हैं। उदाहरण के लिए, यदि आपके एंड्रॉइड पैकेज का नाम com.example.appname
, तो आपको अपने प्रदाता को प्राधिकारी com.example.appname.provider
देना चाहिए।
public class MyContract {
public static final String CONTENT_AUTHORITY = "com.example.myApp";
public static final String PATH_DATATABLE = "dataTable";
public static final String TABLE_NAME = "dataTable";
}
एक सामग्री यूआरआई एक यूआरआई है जो एक प्रदाता में डेटा की पहचान करता है। कंटेंट यूआरआई में पूरे प्रदाता का प्रतीकात्मक नाम (इसका प्राधिकरण) और एक नाम होता है जो टेबल या फाइल (एक पथ) की ओर इशारा करता है। वैकल्पिक आईडी भाग एक तालिका में एक व्यक्तिगत पंक्ति को इंगित करता है। ContentProvider के प्रत्येक डेटा एक्सेस विधि में तर्क के रूप में एक सामग्री URI है; यह आपको तालिका, पंक्ति, या फ़ाइल का उपयोग करने के लिए निर्धारित करने की अनुमति देता है। इन्हें अनुबंध वर्ग में परिभाषित करें।
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon().appendPath(PATH_DATATABLE).build();
// define all columns of table and common functions required
2) हेल्पर क्लास बनाएं
एक सहायक वर्ग डेटाबेस निर्माण और संस्करण प्रबंधन का प्रबंधन करता है।
public class DatabaseHelper extends SQLiteOpenHelper {
// Increment the version when there is a change in the structure of database
public static final int DATABASE_VERSION = 1;
// The name of the database in the filesystem, you can choose this to be anything
public static final String DATABASE_NAME = "weather.db";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// Called when the database is created for the first time. This is where the
// creation of tables and the initial population of the tables should happen.
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// Called when the database needs to be upgraded. The implementation
// should use this method to drop tables, add tables, or do anything else it
// needs to upgrade to the new schema version.
}
}
3) एक वर्ग बनाएं जो ContentProvider वर्ग का विस्तार करता है
public class MyProvider extends ContentProvider {
public DatabaseHelper dbHelper;
public static final UriMatcher matcher = buildUriMatcher();
public static final int DATA_TABLE = 100;
public static final int DATA_TABLE_DATE = 101;
एक UriMatcher एक पूर्णांक मान के लिए एक प्राधिकरण और पथ का मानचित्रण करता है। विधि match()
एक यूआरआई के लिए एक अद्वितीय पूर्णांक मान लौटाता है (यह किसी भी मनमाने ढंग से संख्या हो सकती है, जब तक कि यह अद्वितीय है)। एक स्विच स्टेटमेंट संपूर्ण तालिका को क्वेरी करने और एकल रिकॉर्ड के लिए क्वेरी करने के बीच चयन करता है। यदि URI तालिका की सामग्री URI है और यदि उस तालिका के भीतर एक विशिष्ट पंक्ति के लिए URI इंगित करता है, तो हमारा UriMatcher 100 लौटाता है। आप किसी भी स्ट्रिंग के साथ मिलान करने के लिए #
वाइल्डकार्ड का उपयोग किसी भी संख्या और *
साथ कर सकते हैं।
public static UriMatcher buildUriMatcher() {
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(CONTENT_AUTHORITY, MyContract.PATH_DATATABLE, DATA_TABLE);
uriMatcher.addURI(CONTENT_AUTHORITY, MyContract.PATH_DATATABLE + "/#", DATA_TABLE_DATE);
return uriMatcher;
}
महत्वपूर्ण: addURI()
के आदेश addURI()
कॉल मामलों! UriMatcher क्रमिक क्रम में पहले जोड़े से अंतिम तक दिखेगा। चूंकि #
और *
जैसे वाइल्डकार्ड लालची हैं, इसलिए आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपने अपने यूआरआई को सही तरीके से ऑर्डर किया है। उदाहरण के लिए:
uriMatcher.addURI(CONTENT_AUTHORITY, "/example", 1);
uriMatcher.addURI(CONTENT_AUTHORITY, "/*", 2);
उचित क्रम है, क्योंकि मिलानकर्ता /*
मैच का सहारा लेने से पहले पहले /example
तलाश करेगा। अगर ये मेथड कॉल उल्टा हो गया और आपने uriMatcher.match("/example")
, तो UriMatcher मैचों की तलाश करना बंद कर देगा क्योंकि यह /*
पथ से सामना करता है और गलत परिणाम लौटाता है!
फिर आपको इन कार्यों को ओवरराइड करना होगा:
onCreate () : अपने प्रदाता को प्रारंभ करें। Android सिस्टम आपके प्रदाता को बनाने के तुरंत बाद इस विधि को कॉल करता है। ध्यान दें कि जब तक एक ContentResolver ऑब्जेक्ट इसे एक्सेस करने की कोशिश नहीं करता, तब तक आपका प्रदाता नहीं बनता।
@Override
public boolean onCreate() {
dbhelper = new DatabaseHelper(getContext());
return true;
}
getType () : सामग्री URI के अनुरूप MIME प्रकार लौटाएं
@Override
public String getType(Uri uri) {
final int match = matcher.match(uri);
switch (match) {
case DATA_TABLE:
return ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + MyContract.CONTENT_AUTHORITY + "/" + MyContract.PATH_DATATABLE;
case DATA_TABLE_DATE:
return ContentResolver.ANY_CURSOR_ITEM_TYPE + "/" + MyContract.CONTENT_AUTHORITY + "/" + MyContract.PATH_DATATABLE;
default:
throw new UnsupportedOperationException("Unknown Uri: " + uri);
}
}
क्वेरी () : अपने प्रदाता से डेटा प्राप्त करें। तालिका का चयन करने के लिए तर्कों का उपयोग करें, वापस जाने के लिए पंक्तियों और स्तंभों और परिणाम के क्रम को क्रमबद्ध करें। डेटा को कर्सर ऑब्जेक्ट के रूप में लौटाएं।
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor retCursor = dbHelper.getReadableDatabase().query(
MyContract.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
retCursor.setNotificationUri(getContext().getContentResolver(), uri);
return retCursor;
}
अपने प्रदाता में एक नई पंक्ति डालें। गंतव्य तालिका का चयन करने और उपयोग करने के लिए स्तंभ मान प्राप्त करने के लिए तर्कों का उपयोग करें। नई सम्मिलित पंक्ति के लिए एक सामग्री URI लौटाएँ।
@Override
public Uri insert(Uri uri, ContentValues values)
{
final SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = db.insert(MyContract.TABLE_NAME, null, values);
return ContentUris.withAppendedId(MyContract.CONTENT_URI, ID);
}
हटाएं () : अपने प्रदाता से पंक्तियों को हटाएं। हटाने के लिए तालिका और पंक्तियों का चयन करने के लिए तर्कों का उपयोग करें। हटाई गई पंक्तियों की संख्या लौटाएं।
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int rowsDeleted = db.delete(MyContract.TABLE_NAME, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
}
अद्यतन () : अपने प्रदाता में मौजूदा पंक्तियों को अपडेट करें। अद्यतन और नए कॉलम मान प्राप्त करने के लिए तालिका और पंक्तियों का चयन करने के लिए तर्कों का उपयोग करें। अपडेट की गई पंक्तियों की संख्या लौटाएं।
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int rowsUpdated = db.update(MyContract.TABLE_NAME, values, selection, selectionArgs);
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
4) मैनिफ़ेस्ट फ़ाइल अपडेट करें
<provider
android:authorities="com.example.myApp"
android:name=".DatabaseProvider"/>