কখন কোনও সামগ্রী সরবরাহকারী ব্যবহার করবেন


103

আমি বুঝতে পারি যে কন্টেন্ট সরবরাহকারীগণ অ্যাপ্লিকেশনগুলির মধ্যে প্রকাশ্যে ডেটা ভাগ করার অনুমতি দেওয়ার জন্য তৈরি করা হয়েছে। তবে, আমি ভাবছি যে কারও কাছে আপনার নিজের অ্যাপ্লিকেশনটিতে কেবল কোনও সামগ্রী সরবরাহকারী তৈরি করার বিষয়ে চিন্তাভাবনা আছে। এটি করার কোনও সুবিধা কি হবে? কোন অসুবিধা?

অতীতে আমি কেবলমাত্র আমার ডাটাবেস থেকে ডেটা অ্যাক্সেস করার জন্য এসকিউলেট ওপেনহেল্পার বাস্তবায়ন করেছি, তবে আমি একটি সামগ্রী সরবরাহকারী তৈরি করার বিষয়টি বিবেচনা করছি। আমি ইউআরআই পদ্ধতির ডেটা অনুরোধ করার পদ্ধতিটি পরিষ্কার এবং সংক্ষিপ্ত বলে মনে হচ্ছে। অন্যদিকে, কেবলমাত্র আমার অ্যাপ্লিকেশনটির জন্য কোনও সামগ্রী সরবরাহকারী ব্যবহার করা কি অপ্রয়োজনীয় হবে (যেহেতু এর মধ্যে আমার একটি এসকিউলেটওপেনহেলপার ক্লাস থাকবে) এবং আমার প্রয়োজনের তুলনায় আরও কাজ করা হবে?


2
বিষয়বস্তু সরবরাহকারীকে লেখা সহজ করে তুলতে আমি একটি লাইব্রেরি তৈরি করেছি। সাদামাটা এসকিউএলাইট ওপেনহেলপার লেখার চেয়েও সহজ। github.com/coocood/VContentProvider
কোকুড

উত্তর:


59

আপনি যদি ডেটা ভাগ করে নেওয়ার পরিকল্পনা না করেন তবে সামগ্রী সরবরাহকারীদের সম্পর্কে চিন্তা করবেন না। এগুলি শক্তিশালী তবে লেখা শক্ত এবং আপনি যদি অভ্যন্তরীণভাবে সেগুলি ব্যবহার করতে চলেছেন তবে এগুলি কার্যকর করা কেবল নির্বোধ হবে।

তবে, আমি ভাবছি যে কারও কাছে আপনার নিজের অ্যাপ্লিকেশনটিতে কেবল কোনও সামগ্রী সরবরাহকারী তৈরি করার বিষয়ে চিন্তাভাবনা আছে।

অবশ্যই ... উদাহরণস্বরূপ, আমি লিখেছি একটি পুরানো টোডো তালিকার অ্যাপ্লিকেশনটির জন্য, অন্যান্য অ্যাপ্লিকেশনগুলিকে পুনরুদ্ধার করতে এবং টাস্কগুলির স্থিতিতে অ্যাক্সেসের অনুমতি দেওয়ার জন্য আমাকে একটি সামগ্রী সরবরাহকারী লিখতে হয়েছিল। এটি প্রয়োজনীয়তার অংশ ছিল তবে এর চেয়ে বেশি এটি বোধগম্য হয়েছিল এবং অ্যাপটিকে সুন্দর করেছে।


34
আমি আপনার ন্যায্যতার সাথে একমত, তবে আমি এটিও গুরুত্বপূর্ণ মনে করি (বিশেষত নতুনদের জন্য) যে বিষয়বস্তু সরবরাহকারী কার্যকর হয়ে গেলে আপনি প্রচুর উপকার পাবেন। উদাহরণস্বরূপ, আপনি CursorLoaderঅ্যাসিঙ্ক্রোনাস ক্যোয়ারীগুলি সম্পাদন করতে ব্যবহার করতে পারেন ... আপনার জিজ্ঞাসাগুলি সম্পাদনের জন্য আপনার একক দৃষ্টান্ত অ্যাক্সেস রয়েছে ( ContentResolverইত্যাদি) অবশ্যই আপনার এসকিউএল ডাটাবেসের জন্য আপনি নিজের লোডার প্রয়োগ করতে পারবেন ... অবশ্যই আপনি পুরো অ্যাপ্লিকেশন জুড়ে একটি একক ডাটাবেস উদাহরণ অ্যাক্সেস বাস্তবায়ন করতে পারে ... এবং অবশ্যই আপনি যদি ভাগ না করতে চান তবে কনটেন্টপ্রোভাইডার প্রয়োজন হয় না
অ্যালেক্স লকউড

11
অন্যান্য অ্যাপ্লিকেশন সহ ডেটা। এটি বলেছিল যে আপনার নিজের সামগ্রী সরবরাহকারীকে বাস্তবায়নের সাথে অনেকগুলি সুবিধা রয়েছে, সুতরাং আপনার অ্যাপ্লিকেশনটি এর ডেটা ভাগ না করার কারণে আপনার এটিকে বিবেচনা থেকে বাদ দেওয়া উচিত নয়।
অ্যালেক্স লকউড

8
হ্যাঁ, আপনি সম্পূর্ণরূপে ঠিক বলেছেন তবে আমি এখনও মনে করি এটি বেশিরভাগ ক্ষেত্রে প্রচেষ্টাটির পক্ষে মূল্যহীন নয়। আমি অন্তত 12 রকম Android অ্যাপ্লিকেশানগুলি করেছ (প্লে স্টোর প্রকাশিত) এবং একটি প্রয়োজন না ContentProvider। প্রকৃতপক্ষে, আমরা শেষ অ্যাপটিটিতে কাজ করছিলাম প্রাথমিকভাবে ContentProviderএটি একটি দিয়ে তৈরি হয়েছিল এবং আমরা কেবল মুছে ফেলেছিলাম যেহেতু এটি গাধাটির যতটা ব্যবহার করা উচিত তার চেয়ে বেশি ব্যথা হয় (এমনকি বেসিকের প্রয়োগগুলি আরও সহজ করার জন্য আমি একটি গ্রন্থাগারও লিখেছিলাম ContentProvider: github.com/casidiablo/persistance তবে এটি কখনও আমার স্ব XD ব্যবহার করে নি)।
ক্রিশ্চিয়ান

1
@ ক্রিশ্চিয়ান সবচেয়ে ব্যবহারিক পরামর্শ দেয়। এমনকি অ্যান্ড্রয়েড ডকুমেন্টেও বলা আছে যে আমাদের প্রয়োজন না ContentProviderহলে আমাদের ব্যবহার করা উচিত নয় - "যদি আপনার নিজের প্রয়োগের মধ্যে সম্পূর্ণরূপে ব্যবহার হয় এবং আপনার প্রয়োজন না হয় তবে আপনার ডাটাবেস বা অন্য ধরণের ধ্রুবক স্টোরেজ ব্যবহার করার প্রয়োজন নেই you উপরে উল্লিখিত কোনও বৈশিষ্ট্য Instead অন্যথায়, আমরা কেবল ইঞ্জিনিয়ারিং শেষ করছি।
চেওক ইয়ান চেং

সংক্ষিপ্তসার: আপনি যদি আপনার ডেটা ভাগ করে নেওয়ার পরিকল্পনা না করেন তবে আপনি সামগ্রী সরবরাহকারী এড়াতে পারবেন তবে অন্যদিকে আপনার অ্যাপ্লিকেশনটির ডেটাবেস পরিবর্তন করতে চাইলে সামগ্রী সরবরাহকারী আপনার জীবনকে সহজ করে তুলবে। যেমন এসকিউএলাইট থেকে ম্যাঙ্গোডিবিতে।
প্রশান্ত

116

আমি যুক্তি দিয়ে বলব যে ContentProviderএটি প্রকাশ্যে আনার ইচ্ছা না থাকলেও এটি অবশ্যই ব্যবহার করা ভাল ধারণা ।

অভ্যন্তরীণভাবে পরিবর্তিত হওয়া আরও সহজ করার জন্য আপনার ডেটার উপরে অতিরিক্ত স্তরের বিমূর্ততা সরবরাহ করা অনুশীলন। আপনি যদি পরবর্তী সময়ে অন্তর্নিহিত ডাটাবেস কাঠামো পরিবর্তন করার সিদ্ধান্ত নেন? আপনি যদি এটি ব্যবহার করেন তবে আপনি এর ContentProviderমধ্যে সমস্ত কাঠামোগত পরিবর্তনগুলি ধারণ করতে পারেন, যেখানে আপনি যদি এটি ব্যবহার করেন না, আপনাকে কাঠামোগত পরিবর্তনগুলি দ্বারা প্রভাবিত কোডের সমস্ত অঞ্চল পরিবর্তন করতে বাধ্য করা হবে। তদুপরি, আপনার কোডটি ডেটাবেজে স্বল্প-স্তরের অ্যাক্সেসের সাথে লিটারের চেয়ে ডেটা অ্যাক্সেসের জন্য একই স্ট্যান্ডার্ড এপিআই পুনরায় ব্যবহার করতে সক্ষম হওয়াই ভাল।

এছাড়াও, ভবিষ্যতে আপনি আপনার ডেটা প্রকাশ করতে চান এমন সম্ভাবনা সবসময়ই থাকে। যদি আপনি কোনও ContentProviderসম্মুখ ফ্রন্ট ব্যবহার না করেন তবে পরবর্তী তারিখে এটি পুনঃনির্মাণ করা আরও শক্ত হয়ে উঠবে।

তারপরে, অ্যান্ড্রয়েডের অন্যান্য অংশগুলি রয়েছে যেখানে ContentProviderপ্রয়োজন / প্রস্তাবিত যেমন যেমন ব্যবহার করার সময় SyncAdapterএবং আপনি যদি কোনও অ্যাপ্লিকেশন উইজেট চান যা উদাহরণস্বরূপ ডেটা অ্যাক্সেসের সাথে জড়িত থাকে।

সংক্ষেপে, একটি ContentProviderআপ ফ্রন্ট লেখার সাথে খুব কম ওভারহেড জড়িত থাকে (আপনি একবার এপিআই শিখলেন যা যাইহোক একটি ভাল ধারণা) সুতরাং এটি ব্যক্তিগত তথ্য এমনকি এটি করার জন্য বোধ করে।


1
আমি আর একমত হতে পারি না। এটি আপনাকে এমনভাবে আপনার ডেটা স্তরটিকে বিমূর্ত করতে বাধ্য করে যা ব্যবহারিকভাবে নিশ্চিত করে যে কোনও নতুন বিকাশকারী এটির সাথে ইউআইকে জুটিতে সক্ষম হবে না।
গ্যাব্রিয়েল

3
অ্যান্ড্রয়েড শেখার সাথে সাথে, আমি ঠিক একই কারণে একই কারণে ভাবতে শুরু করি। এমনকি সর্বজনীন না হলেও, আপনি বর্ধিত বিমূর্ততা এবং আপনার স্থাপত্যিক সিদ্ধান্তের বাস্তবায়নের একক পয়েন্ট থেকে সর্বদা উপকৃত হতে পারেন। আমি বিষয়বস্তু সরবরাহকারীদের পছন্দ করি।
ডেভিডসিএসবি

1
আপনি এই বৈশিষ্ট্যটির সাহায্যে সামগ্রী সরবরাহকারীকে কেবল আপনার নিজের অ্যাপ্লিকেশনে উপলব্ধ করতে পারেন:android:exported="false"
টবি 1 কেনবি

4
আমার নম্র মতামত অনুসারে, আপনি কন্টেন্টপ্রাইডার বাস্তবায়নের কোনও প্রয়োজন ছাড়াই সম্পূর্ণ বিমূর্ত পদ্ধতিতে আপনার ডেটা পরিচালনা করতে এবং করতে পারেন।
hmartinezd

2
যেহেতু আমি আমার অভ্যন্তরীণ স্ক্লাইট ডিবি (অন্যান্য অ্যাপ্লিকেশনগুলির সাথে কোনও ইন্টারঅ্যাকশন নয়) এর জন্য একটি কন্টেন্টপ্রোভাইডার সমাধানটি কার্যকর করার পথে, আমি বিকাশকারী.অ্যান্ড্রয়েড / গাইড / টপিক্স / প্রোভাইডার / on-তে মন্তব্যটি দেখেছি যা আপনাকে সরবরাহকারীর প্রয়োজন নেই
সেলুক সিহান

7

গ্রহণের জন্য মোটোডেভ স্টুডিওতে একবার দেখুন। এটি একটি বিকাশের পরিবেশ যা গ্রহনকে প্রসারিত করে। তাদের একটি সরঞ্জাম রয়েছে যেখানে আপনি স্বয়ংক্রিয়ভাবে কোনও ডাটাবেসের জন্য একটি সামগ্রী সরবরাহকারী তৈরি করতে পারেন। যদি কোনও সামগ্রী সরবরাহকারী আপনার ডেটা অ্যাক্সেস করা আরও সহজ করে তোলে এবং এটির পারফরম্যান্সের উপর উল্লেখযোগ্য প্রভাব নেই এবং এগিয়ে ব্যবহার করুন। বেশিরভাগ পরিস্থিতিতে এই ক্ষেত্রে হবে।


5

সংক্ষেপে, কার্যকরভাবে আপনার ডেটা পরিচালনা করতেContent Providers সহায়তা করে । আমি নিম্নলিখিত কারণে সেগুলি ব্যবহার করার পরামর্শ দেব।

  • এটি আপনার ইউআই এবং ডাটাবেসের মধ্যে বিমূর্ত স্তর হিসাবে কাজ করে । ব্যবহারকারীর দ্বারা প্রবেশ করা ডেটা যাচাই করতে আপনি কন্টেন্টপ্রায়ারগুলিতে ডেটা বৈধকরণ প্রয়োগ করতে পারেন । এটি ইউআই এবং অন্যান্য অংশগুলিকে স্পর্শ না করে আপনাকে ডাটাবেসের কাঠামো পরিবর্তন করতে দেয় ।
  • তারা অন্যান্য অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ক্লাসগুলির মতো দুর্দান্তভাবে খেলবে SyncAdapter। উদাহরণস্বরূপ, আপনি যখন কন্টেন্টপ্রোভাইডার ব্যবহার করে ডাটাবেসের কোনও মান পরিবর্তন করে তবে আপনি একটি তালিকা স্বয়ংক্রিয়ভাবে রিফ্রেশ করতে পারেন CursorLoader। কন্টেন্টপ্রাইডারগুলি ছাড়া আপনাকে এগুলি এর মতো অনেকগুলি কার্যকারিতা বাস্তবায়ন করতে হবে।
  • আমরা আমাদের ব্যক্তিগত ডেটা অন্য অ্যাপ্লিকেশনগুলিতে নিরাপদে প্রকাশ করতে পারি । কনটেন্টপ্রোভাইডার ব্যবহার করে আমাদের অন্যান্য অ্যাপ্লিকেশনগুলির সাথে সহজেই এবং নিরাপদে আমাদের ডেটা ভাগ করার অনুমতি দেবে।

সুতরাং এখনই যদি আপনার এই ক্রিয়াকলাপগুলির কোনও প্রয়োজন না হয় তবে আপনার ভবিষ্যতে এগুলি প্রয়োজন হতে পারে এবং অতিরিক্ত মাইল যেতে এবং এই মুহুর্তে এটিকে বাস্তবায়ন করা ভাল।


দুর্দান্ত উত্তর। একক বাক্য বিবরণ ContentProvidersএবং তিনটি পৃথক কারণে কেন আমাদের সেগুলি ব্যবহার করা উচিত। কখনও কখনও সহজ ব্যাখ্যা সেরা হয়। +1
অ্যাডামইন ওকুলাস

4

আমি সম্মতি দিচ্ছি কন্টেন্টপ্রাইডারগুলি উপলব্ধি করা কিছুটা কঠিন তবে তারা আপনার নিজের অ্যাপ্লিকেশনের জন্য অভ্যন্তরীণভাবে তাদের ব্যবহার করতে চাইলেও সেগুলি অবশ্যই সহায়ক। এটি সম্পর্কে সর্বোত্তম জিনিসটি হ'ল আপনি উপযুক্ত ইউআরআইয়ের জন্য সামগ্রী প্রভাটিকে কাস্টমাইজ করতে পারেন।

এখানে এমন একটি দৃশ্য রয়েছে যেখানে আপনার ডাটাবেসে 5 টি টেবিল থাকতে পারে, তবে সেগুলি ব্যবহারের আগে আপনাকে কয়েকটি নির্দিষ্ট ক্রমে যোগ দিতে হবে। এবং এই প্রতিটি যোগদানের জন্য একটি সামগ্রী ইউআরআই করুন। এরপরে আপনি প্রতিটি ইউআরআই টেবিল হিসাবে ব্যবহার করতে পারেন :)

আমি আপনাকে কনটেন্ট সরবরাহকারীর সাথে এগিয়ে যাওয়ার পরামর্শ দিচ্ছি, এটি কতটা শক্তিশালী তা দেখে আপনি অবাক হয়ে যাবেন।


2

আমার দৃষ্টিতে বিষয়বস্তু সরবরাহকারী প্রচুর সুবিধার সাথে আসে কেবলমাত্র অন্যান্য অ্যাপ্লিকেশনগুলির সাথে ডেটা ভাগ করে নিচ্ছে। আপনার যদি সিঙ্ক-অ্যাডাপ্টার ব্যবহার করে সার্ভারের সাথে সিঙ্ক্রোনাইজ করার দরকার হয়, গুগল ক্লাউড মেসেজিং ব্যবহার করুন, ডিবিতে অন্তর্নিহিত ডেটা লোডার ব্যবহার করে পরিবর্তিত হয়, অনুসন্ধান প্রয়োগ করে, উইজেট ব্যবহার করুন ... তারপরে সামগ্রী সরবরাহকারী আপনার জন্য।

আমি আপনাকে গাইডলাইনটি অনুসরণ করতে পছন্দ করি কারণ একদিন আপনার বিষয়বস্তু সরবরাহকারীর সাথে সংযুক্ত উপরের বৈশিষ্ট্যগুলির কয়েকটি প্রয়োগ করতে হতে পারে

উপায় দ্বারা, আপনি কন্টেন্ট সরবরাহকারী জেনারেটর ব্যবহার করে 5 মিনিটেরও কম সময়ে আপনার ডেটাবেস এবং সিপি দ্রুত তৈরি করতে পারেন


1

ডকুমেন্টেশনে যেমন বলা হয়েছে: সামগ্রী সরবরাহকারী তৈরি করা হচ্ছে

যদি ব্যবহারটি সম্পূর্ণ নিজের প্রয়োগের মধ্যে থাকে তবে আপনার এসকিউএলাইট ডাটাবেস ব্যবহার করার জন্য কোনও সরবরাহকারীর প্রয়োজন নেই।

তাহলে কেন এই ওভারহেড বিকাশ করতে বিরক্ত করবেন? আপনি সহজ এবং দ্রুত বিকাশ চান, তাই না? সুতরাং বিমূর্তির একটি স্তর (এসকিউএলইটহেনহেল্পার বংশধর) যথেষ্ট।

ওকামের রেজার দেখুন খুব ভাল কারণ ছাড়া কোনও সত্তা তৈরি করবেন না।


0

অন্যান্য অ্যাপ্লিকেশনগুলির সাথে ডেটা ভাগ করতে না চাইলে সামগ্রী সরবরাহকারী ব্যবহার করবেন না। ডাটাবেস ক্রিয়াকলাপ সম্পাদন করতে সাধারণ স্ক্লাইটিড ডাটাবেস ব্যবহার করুন। গোপনীয় তথ্য সংরক্ষণের জন্য সামগ্রী সরবরাহকারী ব্যবহার করার সময় সতর্ক থাকুন কারণ আপনার গোপনীয় তথ্যটি অন্যান্য অ্যাপ্লিকেশন দ্বারা অ্যাক্সেস করা যেতে পারে


ডিফল্টরূপে সামগ্রী সরবরাহকারী উন্মুক্ত হয় না এবং এগুলিতে অ্যাক্সেস সীমাবদ্ধতা পরিচালনা করা সহজ। ভুল তথ্য ছড়িয়ে দেওয়ার জন্য ডাউনভোট।
TBridges42

2
@ TBridges42 আপনি (ভুল) ভুল ছিলেন। প্রকৃতপক্ষে এপিআই স্তরের 17 সামগ্রী সরবরাহকারীদের প্রকাশ করা হয়েছিল । এবং উত্তরের সময় পর্যন্ত 25% অ্যান্ড্রয়েড ডিভাইস আপনার আচরণের সময় এই আচরণ থেকে প্রভাবিত হয়েছিল এবং এখনও 10% ছিল । সুতরাং, এটি আরও অন্যান্য উপায়ে: আপনার মন্তব্যটি বিপজ্জনক, কারণ আপনি এমন কিছু সুরক্ষিত হিসাবে বর্ণনা করেছেন যা সত্য নয় /
মার্মেল

0

সামগ্রী সরবরাহকারী ব্যবহার করা বিমূর্ততার একটি অতিরিক্ত স্তরে সহায়তা করতে পারে - এটি আপনার নিজের প্রয়োগের মধ্যে রেখে দেওয়া আপনার প্রকল্পের জন্য একটি উল্লেখযোগ্য বিকাশের সময় যুক্ত করে। তবে আপনি যদি এটি একাধিক অ্যাপ্লিকেশন জুড়ে ডেটা, অ্যাপ্লিকেশন সেটিংস বা কনফিগারেশনগুলি ভাগ করে নিতে ব্যবহার করেন তবে সামগ্রী সরবরাহকারী আপনার পছন্দ।

আপনার সুরক্ষা স্তরগুলি দেখুন এবং আমি আপনার সামগ্রী সরবরাহকারী এসকিউএলাইট লিখতে থাকলে এসকিউএলসিফারটি ডেটা-এ-রিসেট (ডিএআর) এনক্রিপ্ট করার জন্য সুপারিশ করব। (আমি কয়েকটি সমাধানে একটি সামগ্রী সরবরাহকারী ব্যবহার করেছি এবং ডিবাগিং এবং পরীক্ষার জন্য অপারেশনাল মানগুলির একটি সরাসরি "স্ন্যাপ শট" নেওয়ার ক্ষমতা সরবরাহ করেছি।)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.