เมื่อใดควรใช้ผู้ให้บริการเนื้อหา


103

ฉันเข้าใจว่าผู้ให้บริการเนื้อหาทำขึ้นเพื่ออนุญาตให้แชร์ข้อมูลแบบสาธารณะระหว่างแอปพลิเคชัน อย่างไรก็ตามฉันสงสัยว่ามีใครคิดจะสร้าง Content Provider เพื่อใช้ภายในแอปของคุณเอง การทำเช่นนี้จะมีข้อดีหรือไม่? ข้อเสียใด ๆ ?

ในอดีตฉันเพิ่งติดตั้ง SQliteOpenHelper เพื่อเข้าถึงข้อมูลจากฐานข้อมูลของฉัน แต่ฉันกำลังพิจารณาที่จะสร้างผู้ให้บริการเนื้อหา ฉันรู้สึกว่าวิธีการขอข้อมูล URI นั้นชัดเจนและรัดกุม ในทางกลับกันการใช้ Content Provider สำหรับแอปพลิเคชันของฉันจะซ้ำซ้อน (เนื่องจากภายในนั้นฉันจะมีคลาส SQliteOpenHelper) และทำงานได้มากกว่าที่ฉันต้องการหรือไม่


2
ฉันสร้างห้องสมุดเพื่อให้ผู้ให้บริการเนื้อหาเขียนได้ง่าย ง่ายกว่าการเขียน SQLiteOpenHelper ธรรมดา github.com/coocood/VContentProvider
coocood

คำตอบ:


59

หากคุณไม่ได้วางแผนที่จะแบ่งปันข้อมูลอย่าคิดถึงผู้ให้บริการเนื้อหา พวกเขามีพลัง แต่เขียนยากและมันจะโง่แค่ไหนที่จะนำมันไปใช้หากคุณจะใช้มันภายใน

อย่างไรก็ตามฉันสงสัยว่ามีใครคิดจะสร้าง Content Provider เพื่อใช้ภายในแอปของคุณเอง

แน่นอน ... ตัวอย่างเช่นสำหรับแอปรายการสิ่งที่ต้องทำเก่าที่ฉันเขียนฉันต้องเขียนผู้ให้บริการเนื้อหาเพื่ออนุญาตให้แอปอื่นดึงและเข้าถึงสถานะงาน เป็นส่วนหนึ่งของข้อกำหนด แต่ยิ่งไปกว่านั้นมันสมเหตุสมผลและทำให้แอปดีขึ้น


35
ฉันเห็นด้วยกับเหตุผลของคุณ แต่ฉันก็คิดว่ามันสำคัญ (โดยเฉพาะสำหรับผู้เริ่มต้น) ที่เมื่อมีการนำผู้ให้บริการเนื้อหามาใช้คุณจะได้รับประโยชน์มากมาย ตัวอย่างเช่นคุณสามารถใช้CursorLoaderเพื่อดำเนินการสืบค้นแบบอะซิงโครนัส ... คุณสามารถเข้าถึงอินสแตนซ์ซิงเกิลตัน (the ContentResolver) เพื่อดำเนินการสืบค้น ฯลฯ แน่นอนว่าคุณสามารถใช้ Loader ของคุณเองเพื่อใช้กับฐานข้อมูล SQLite ของคุณได้ ... แน่นอนคุณ สามารถใช้การเข้าถึงอินสแตนซ์ฐานข้อมูลเดียวในแอปพลิเคชันทั้งหมด ... และแน่นอนว่าไม่จำเป็นต้องใช้ ContentProvider เว้นแต่คุณต้องการแบ่งปัน
Alex Lockwood

12
ข้อมูลกับแอปอื่น ๆ ที่กล่าวว่ามีหลายผลประโยชน์ที่มาพร้อมกับการดำเนินการของผู้ให้บริการคอนเทนต์ของคุณเองดังนั้นคุณไม่ควรวางไว้จากการพิจารณาเพียงเพราะแอปของคุณไม่ได้เปิดเผยข้อมูล
Alex Lockwood

8
ใช่คุณพูดถูก แต่ฉันก็ยังคิดว่ามันไม่คุ้มกับความพยายามในกรณีส่วนใหญ่ ฉันทำแอพ Android ที่แตกต่างกันอย่างน้อย 12 แอพ (เผยแพร่ไปยัง Play Store) และไม่ต้องการไฟล์ContentProvider. ในความเป็นจริงแอพสุดท้ายที่เรากำลังทำงานนั้นสร้างขึ้นในตอนแรกโดยใช้ a ContentProviderและเราเพิ่งลบไปเนื่องจากมันเป็นความเจ็บปวดในการใช้งานมากกว่าที่ควรจะเป็น (ฉันเขียนไลบรารีเพื่อให้ง่ายต่อการใช้ContentProviders พื้นฐาน: github.com/casidiablo/persistenceแต่ไม่เคยใช้ XD ตัวเองของฉัน)
Cristian

1
@ คริสเตียนให้คำแนะนำที่เป็นประโยชน์มากที่สุด แม้แต่เอกสาร Android ก็ระบุว่าเราไม่ควรใช้ContentProviderถ้าเราไม่จำเป็นต้องใช้ - "คุณไม่จำเป็นต้องมีผู้ให้บริการเพื่อใช้ฐานข้อมูลหรือพื้นที่เก็บข้อมูลถาวรประเภทอื่น ๆ หากการใช้งานอยู่ภายในแอปพลิเคชันของคุณเองทั้งหมดและคุณไม่จำเป็นต้องใช้ คุณลักษณะใด ๆ ที่ระบุไว้ข้างต้นคุณสามารถใช้ระบบจัดเก็บข้อมูลที่อธิบายไว้ในหน้าการบันทึกข้อมูลแอป " มิฉะนั้นเราจะจบแค่วิศวกรรม
Cheok Yan Cheng

สรุป: หากคุณไม่ได้วางแผนที่จะแบ่งปันข้อมูลของคุณคุณสามารถหลีกเลี่ยงผู้ให้บริการเนื้อหาได้ แต่ในทางกลับกันผู้ให้บริการเนื้อหาจะทำให้ชีวิตของคุณง่ายขึ้นหากคุณต้องการเปลี่ยนฐานข้อมูลของแอป เช่นจาก SQLite ถึง MangoDB
Prashant

117

ฉันขอโต้แย้งว่าเป็นความคิดที่ดีที่จะใช้ContentProviderแม้ว่าคุณจะไม่ได้ตั้งใจที่จะเปิดเผยต่อสาธารณะก็ตาม

เป็นแนวทางปฏิบัติที่ดีในการเพิ่มระดับนามธรรมให้กับข้อมูลของคุณเพื่อให้ง่ายต่อการเปลี่ยนแปลงภายใน จะเกิดอะไรขึ้นหากคุณตัดสินใจที่จะเปลี่ยนโครงสร้างฐานข้อมูลในภายหลัง หากคุณใช้ a ContentProviderคุณสามารถมีการเปลี่ยนแปลงโครงสร้างทั้งหมดภายในได้โดยที่หากคุณไม่ได้ใช้งานคุณจะต้องเปลี่ยนทุกส่วนของโค้ดที่ได้รับผลกระทบจากการเปลี่ยนแปลงโครงสร้าง นอกจากนี้เป็นเรื่องดีที่สามารถใช้ API มาตรฐานเดียวกันในการเข้าถึงข้อมูลได้อีกครั้งแทนที่จะทิ้งโค้ดของคุณด้วยการเข้าถึงฐานข้อมูลระดับต่ำ

นอกจากนี้ยังมีโอกาสที่คุณอาจต้องการเปิดเผยข้อมูลของคุณในอนาคตอยู่เสมอ หากคุณไม่ใช้งานContentProviderด้านหน้าการติดตั้งเพิ่มเติมในภายหลังจะทำได้ยากกว่ามาก

จากนั้นมีส่วนอื่น ๆ ของ Android ที่ContentProviderจำเป็น / แนะนำเช่นเมื่อใช้SyncAdapters และถ้าคุณต้องการ App Widget ที่เกี่ยวข้องกับการเข้าถึงข้อมูลเช่น

โดยสรุปมีค่าใช้จ่ายน้อยมากที่เกี่ยวข้องกับการเขียนContentProviderล่วงหน้า (เมื่อคุณได้เรียนรู้ API ซึ่งก็เป็นความคิดที่ดีอยู่แล้ว) ดังนั้นจึงเป็นเรื่องที่ควรทำแม้กระทั่งสำหรับข้อมูลส่วนตัว


1
ฉันไม่เห็นด้วยมากกว่านี้ มันบังคับให้คุณแยกชั้นข้อมูลของคุณในทางปฏิบัติเพื่อให้แน่ใจว่านักพัฒนาใหม่จะไม่สามารถจับคู่ UI กับมันได้
กาเบรียล

3
ทันทีหลังจากเรียนรู้ Android ฉันก็เริ่มคิดแบบเดียวกันกับเหตุผลนี้ แม้ว่าจะไม่ใช่แบบสาธารณะ แต่คุณก็สามารถได้รับประโยชน์จากสิ่งที่เป็นนามธรรมที่เพิ่มขึ้นและการนำการตัดสินใจทางสถาปัตยกรรมไปใช้เพียงจุดเดียว ฉันรัก ContentProviders
davidcsb

2
คุณสามารถทำให้ผู้ให้บริการเนื้อหาพร้อมใช้งานในแอปพลิเคชันของคุณเองโดยใช้แอตทริบิวต์นี้:android:exported="false"
Toby 1 Kenobi

4
ในความเห็นที่ต่ำต้อยของฉันคุณสามารถและควรจัดการกับข้อมูลของคุณในลักษณะที่เป็นนามธรรมโดยสิ้นเชิงโดยไม่จำเป็นต้องใช้ ContentProvider
hmartinezd

2
ในขณะที่ฉันกำลังใช้โซลูชัน contentprovider สำหรับฐานข้อมูล sqlite ภายในของฉัน (ไม่มีการโต้ตอบกับแอปอื่น ๆ ) ฉันเห็นข้อสังเกตเกี่ยวกับdeveloper.android.com/guide/topics/providers/…ซึ่งระบุว่าคุณไม่ต้องการผู้ให้บริการ เพื่อใช้ฐานข้อมูล SQLite หากการใช้งานอยู่ในแอปพลิเคชันของคุณเองทั้งหมด
Selçuk Cihan

7

ดู MOTODEV Studio สำหรับ Eclipse เป็นสภาพแวดล้อมการพัฒนาที่ขยาย Eclipse พวกเขามีเครื่องมือที่คุณสามารถสร้างผู้ให้บริการเนื้อหาสำหรับฐานข้อมูลโดยอัตโนมัติ หากผู้ให้บริการเนื้อหาช่วยให้เข้าถึงข้อมูลของคุณได้ง่ายขึ้นและไม่มีผลกระทบอย่างมีนัยสำคัญต่อประสิทธิภาพให้ใช้งานต่อไป ในสถานการณ์ส่วนใหญ่จะเป็นกรณีนี้


5

ในระยะสั้นContent Providersจะช่วยในการจัดการข้อมูลได้อย่างมีประสิทธิภาพ ฉันขอแนะนำให้ใช้ด้วยเหตุผลดังต่อไปนี้

  • ทำหน้าที่เป็นเลเยอร์นามธรรมระหว่าง UI และฐานข้อมูลของคุณ คุณสามารถใช้การตรวจสอบข้อมูลใน ContentProviders เพื่อตรวจสอบความถูกต้องของข้อมูลที่ป้อนโดยผู้ใช้ นอกจากนี้ยังให้คุณปรับเปลี่ยนโครงสร้างของฐานข้อมูลโดยไม่ต้องสัมผัส UI และส่วนอื่น ๆ
  • พวกเขาเล่นตามอย่างกับคนอื่น ๆในชั้นเรียนหุ่นยนต์กรอบSyncAdapterเช่น สำหรับเช่น. คุณจะสามารถรีเฟรชรายการเมื่อค่าในฐานข้อมูลมีการเปลี่ยนแปลงโดยใช้ ContentProviders CursorLoaderพร้อมกับ หากไม่มี ContentProviders คุณจะต้องใช้ฟังก์ชันมากมายเช่นนี้ด้วยตัวคุณเอง
  • เราสามารถได้อย่างปลอดภัยเปิดเผยข้อมูลส่วนตัวของเราที่จะปพลิเคชันอื่นการใช้ ContentProviders จะช่วยให้เราสามารถแบ่งปันข้อมูลของเรากับแอปอื่น ๆ ได้อย่างง่ายดายและปลอดภัย

ดังนั้นแม้ว่าคุณจะไม่ต้องการฟังก์ชันเหล่านี้ในตอนนี้ แต่คุณอาจต้องการมันในอนาคตและเป็นเรื่องดีที่จะก้าวไปอีกขั้นและใช้งานได้ทันที


คำตอบที่ดี คำอธิบายประโยคเดียวContentProvidersและเหตุผลสามประการที่แยกจากกันที่เราควรใช้ บางครั้งคำอธิบายง่ายๆก็ดีที่สุด +1
AdamInTheOculus

4

ฉันยอมรับว่า ContentProviders เข้าใจยากเล็กน้อย แต่มีประโยชน์อย่างแน่นอนแม้ว่าคุณจะต้องการใช้ภายในสำหรับแอปของคุณเองก็ตาม สิ่งที่ดีที่สุดคือคุณสามารถปรับแต่งผู้ให้บริการเนื้อหาสำหรับ URI ที่เหมาะสมได้

นี่คือสถานการณ์ที่คุณอาจมี 5 ตารางในฐานข้อมูลของคุณ แต่คุณต้องเข้าร่วมสองสามตารางในบางคำสั่งก่อนจึงจะใช้งานได้ และสร้าง URI เนื้อหาสำหรับแต่ละการรวมเหล่านี้ จากนั้นคุณสามารถใช้ URI เหล่านี้เป็นตารางได้ :)

ฉันขอแนะนำให้คุณก้าวไปข้างหน้าด้วย Content Provider คุณจะประหลาดใจเมื่อเห็นว่ามันมีประสิทธิภาพเพียงใด


2

ในมุมมองของฉันผู้ให้บริการเนื้อหามาพร้อมกับข้อได้เปรียบมากมายเพียงแค่แชร์ข้อมูลกับแอปอื่น ๆ หากคุณต้องการซิงโครไนซ์กับเซิร์ฟเวอร์โดยใช้ Sync-Adapter ให้ใช้การส่งข้อความบนคลาวด์ของ Google อัปเดต UI โดยอัตโนมัติเมื่อข้อมูลพื้นฐานในฐานข้อมูลเปลี่ยนแปลงโดยใช้ Loaders ดำเนินการค้นหาใช้วิดเจ็ต ... จากนั้นผู้ให้บริการเนื้อหาจะเหมาะสำหรับคุณ

ฉันอยากให้คุณทำตามแนวทางนี้เพราะวันหนึ่งคุณอาจต้องใช้คุณสมบัติข้างต้นบางอย่างที่แนบมากับผู้ให้บริการเนื้อหา

อย่างไรก็ตามคุณสามารถสร้างฐานข้อมูลและ CP ได้อย่างรวดเร็วภายในเวลาไม่ถึง 5 นาทีโดยใช้ตัวสร้างผู้ให้บริการเนื้อหา


1

ตามที่กล่าวไว้ในเอกสารประกอบ: การสร้างผู้ให้บริการเนื้อหา

คุณไม่จำเป็นต้องมีผู้ให้บริการเพื่อใช้ฐานข้อมูล SQLite หากการใช้งานอยู่ในแอปพลิเคชันของคุณเองทั้งหมด

แล้วทำไมต้องกังวลกับการพัฒนาค่าใช้จ่ายนี้? คุณต้องการการพัฒนาที่ง่ายขึ้นและเร็วขึ้นใช่ไหม? ดังนั้นสิ่งที่เป็นนามธรรมหนึ่งชั้น (SQLiteOpenHelper สืบทอดมา) ก็เพียงพอแล้ว

ดู มีดโกนของ Occam อย่าสร้างเอนทิตีโดยไม่มีเหตุผลที่ดีมาก


0

อย่าใช้ผู้ให้บริการเนื้อหาหากไม่ต้องการแชร์ข้อมูลกับแอพอื่น ใช้ sqlitedatabase อย่างง่ายเพื่อดำเนินการฐานข้อมูล โปรดใช้ความระมัดระวังในการใช้ผู้ให้บริการเนื้อหาเพื่อจัดเก็บข้อมูลที่เป็นความลับเนื่องจากแอปอื่นอาจเข้าถึงข้อมูลที่เป็นความลับของคุณได้


โดยค่าเริ่มต้นผู้ให้บริการเนื้อหาจะไม่ถูกเปิดเผยและการจัดการข้อ จำกัด การเข้าถึงนั้นเป็นเรื่องง่าย โหวตลงคะแนนสำหรับการเผยแพร่ข้อมูลที่ผิด
TBridges42

2
@ TBridges42 คุณ (ถูก) ผิด ในความเป็นจริงจนAPI ระดับ 17 ผู้ให้บริการเนื้อหาได้สัมผัส และเวลาของคำตอบ25% ของอุปกรณ์ Android ได้รับผลกระทบจากปัญหานี้และยังคง10% ในช่วงเวลาของความคิดเห็นของคุณ ดังนั้นจึงเป็นอีกทางหนึ่ง: ความคิดเห็นของคุณเป็นอันตรายเนื่องจากคุณระบุบางสิ่งเพื่อความปลอดภัยซึ่งไม่ใช่ / ไม่ใช่ข้อเท็จจริง
Murmel

0

การใช้ผู้ให้บริการเนื้อหาสามารถช่วยในระดับนามธรรมเพิ่มเติม - การใส่ไว้ในแอปพลิเคชันของคุณเองจะช่วยเพิ่มเวลาในการพัฒนาที่สำคัญให้กับโครงการของคุณ อย่างไรก็ตามหากคุณใช้ข้อมูลนี้เพื่อแชร์ข้อมูลการตั้งค่าแอปพลิเคชันหรือการกำหนดค่าในแอปพลิเคชันต่างๆผู้ให้บริการเนื้อหาก็เป็นทางเลือกของคุณ

ดูระดับความปลอดภัยของคุณและฉันขอแนะนำให้ใช้ SQLcipher เพื่อเข้ารหัสข้อมูลเมื่อรีเซ็ต (DAR) หากผู้ให้บริการเนื้อหาของคุณกำลังเขียนไปยัง SQLite (ฉันใช้ผู้ให้บริการเนื้อหาในโซลูชันบางอย่างและให้ความสามารถในการ "สแนปช็อต" แบบสดของค่าการดำเนินงานสำหรับการดีบักและการทดสอบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.