سؤال

هذا سؤال سحري عميق. أنا أفهم أن دعوة إلى طريقة ContentResolver تأخذ URI محددة لـ ContentProvider ، ولكن كيف يجعل Android بالفعل الارتباط؟

أظن أن أي URI يطابق السلطة المقدمة مع ContentProvider في AndroidManifest.xml متورط. هل يتم إرسال الطلب إلى كل مزود يحتوي على تلك السلطة؟ إذا حاولت إنشاء مقدمي الخدمات الذين تبرز سلطتهم سلطة أخرى ، فستكون هذه مشكلة؟

هل هناك طريقة لمعرفة ما إذا كان ContentProvider يعمل؟ أفكر في أن استجابة وهمية على طريقة gettype () تشير إلى lient.

هل كانت مفيدة؟

المحلول

فصل ContentResolver يحافظ على رسم خرائط من سلطات المحتوى إلى ContentProvider الطبقات. البيانات لهذا التعيين تأتي من <provider> عناصر من مختلف ملفات التطبيقات التي تم تثبيتها "AndroidManifest.xml. يستخدم ContentResolver هذا التعيين لتحديد فئة المزود التي هي الفئة الصحيحة التي يجب استخدامها في URI معين يأتي. فكر في ContentResolver على أنه نوع من DNS. إنه يكتشف الخادم (المزود) الذي هو الصحيح للإجابة على استعلامك.

سوف يتطابق محتوى واحد فقط ، لأن ContentAuthorities (جزء "اسم المجال" من المحتوى: Type URI) مطلوب لتكون فريدة من نوعها. فهي ليست هرمية. عاملهم كسلسلة فريدة من نوعها يجب أن تتطابق تمامًا. السبب في أنها تبدو هرمية هو السماح لطريقة سهلة لضمان التفرد ، مثل الطريقة التي يتم بها ضمان أن تكون أسماء حزم Java فريدة من نوعها.

لكل وصف: "قسم ل الوثائق العلامة:

يحدد نظام Android مقدمي خدمات المحتوى من خلال جزء السلطة من المحتوى: URI. على سبيل المثال ، لنفترض أن URI التالية تنتقل إلى contentResolver.query ():

content://com.example.project.healthcareprovider/nurses/rn

المحتوى: يحدد المخطط البيانات على أنها تنتمي إلى مزود محتوى ويحدد السلطة (com.example.project.HealthCareProvider) المزود المعين. لذلك يجب أن تكون السلطة فريدة من نوعها. عادة ، كما هو الحال في هذا المثال ، هو الاسم المؤهل تمامًا للفئة الفرعية للمحتوى. يمكن استخدام جزء المسار من URI من قبل مزود المحتوى لتحديد مجموعات فرعية بيانات معينة ، ولكن لا يتم الإعلان عن هذه المسارات في البيان

أما بالنسبة لما يحدث عندما تصنع مزودًا يحتوي على حساب محتوى متطابق مع واحد آخر ... حسنًا ، تنفجر الأشياء. على وجه التحديد ، سترفض تثبيت أي حزمة تتواصل في المرتبة الثانية ، قائلاً:

Warn/Packagemanager: لا يمكن التثبيت لأن اسم الموفر com.xxx.provider (في حزمة com.xxx) يستخدم بالفعل بواسطة com.zzz

لذلك .... لا تفعل ذلك.

لا توجد طريقة لمعرفة ما إذا كان المحتوى يعمل. لقد تم تشغيله وتوقفه تلقائيًا بواسطة ContentResolver حسب الحاجة. عندما تبدأ في تقديم طلبات للحصول على محتوى محدد ، سيتم بدء المزود المرتبط إذا لم يتم تشغيله بالفعل. سيتم إيقافه تلقائيًا بواسطة ContentResolver ، في وقت لاحق بمجرد أن يجلس الخمول ويبدو أنه قد لا تكون هناك حاجة إليها لفترة من الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top