ความแตกต่างที่แน่นอนระหว่าง“ Content-Provider” และ“ SQLite Database”


87

ฉันได้ทำการเขียนโปรแกรมฐานข้อมูล SQLite สำหรับ Android แล้ว แต่ฉันไม่รู้อะไรเลยเกี่ยวกับ Content-Provider ยกเว้นสิ่งนี้: "ตามที่ฉันได้อ้างถึงหน้านักพัฒนาซอฟต์แวร์ Android Android SDK ได้อธิบายเกี่ยวกับ" ผู้ให้บริการเนื้อหา "ซึ่งใช้ในการจัดเก็บและดึงข้อมูล"

แต่แล้ว,

  1. อะไรคือความแตกต่างที่แน่นอนระหว่าง "Content-Provider" และ "SQLite Database"?
  2. ข้อใดดีที่สุดในการจัดเก็บข้อมูลเมื่อใด

ตัวอย่างหรือช่วยด้วย !!

คำตอบ:


135

ฉันพบความแตกต่างที่สำคัญอย่างหนึ่งดังนี้:

การจัดเก็บข้อมูลของคุณในฐานข้อมูลเป็นวิธีที่ดีวิธีหนึ่งในการเก็บรักษาข้อมูลของคุณแต่มีข้อแม้ในฐานข้อมูล Android ที่สร้างใน Android เป็นvisibleเพียงแอปพลิเคชันที่สร้างขึ้นเท่านั้น กล่าวคือฐานข้อมูล SQLite ที่สร้างบน Android โดยแอปพลิเคชันเดียวสามารถใช้ได้กับแอปพลิเคชันนั้นเท่านั้นไม่ใช่โดยแอปพลิเคชันอื่น

ดังนั้นถ้าคุณ need to share data between applications, you need to use the content provider model as recommended in Android.บทความนี้นำเสนอข้อมูลพื้นฐานของผู้ให้บริการเนื้อหาและวิธีการนำไปใช้

ฉันพบบทความนี้ที่ลิงค์นี้

ให้ข้อมูลที่ดีจริงๆ


2
ดูเหมือนว่าลิงก์จะตายไปแล้ว ... ไม่เห็นบทความอีกต่อไป ต้องการดูบทความที่คุณอ้างอิงหากคุณพบอีกครั้ง
prolink007

ในวันที่ 11 กุมภาพันธ์ 2555 ลิงก์http://www.devx.com/wireless/Article/41133ทำงาน
k3b

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

2
ข้อดีอีกอย่างคือผู้ให้บริการเนื้อหาใช้เธรดเดียวสำหรับทุกการดำเนินการดังนั้นเธรดหลายเธรดจึงไม่สามารถแก้ไขฐานข้อมูลได้เหมือนในเคส sqlite
Rat-a-tat-a-tat Ratatouille

54

อะไรคือความแตกต่างที่แน่นอนระหว่าง "Content-Provider" และ "SQLite Database"?

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

ข้อใดดีที่สุดในการจัดเก็บข้อมูลเมื่อใด

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


26
ฉันชอบใช้ ContentProvider เนื่องจากเป็นนามธรรมที่ดีมากบน SQL คุณยังสามารถเล่นได้ดีกับ CursorAdapter และข้อกำหนดอัตโนมัติ
alexanderblom

27

ฉันได้สร้างแอพดีๆมากมายโดยมีผู้ใช้หลายพันคนที่ใช้แอพเหล่านี้ซึ่งใช้วิธี SQLite แต่เมื่อไม่นานมานี้และฉันต้องเขียนโค้ดด้วยตนเองจำนวนมากซึ่งตอนนี้ ContentProvider สามารถดูแลได้อย่างง่ายดาย ในตอนนั้นฉันไม่ชอบใช้ Content Providers เพราะดูเหมือนจะเพิ่มความซับซ้อนในโค้ดเท่านั้น

อย่างไรก็ตามในช่วงสองสามปีที่ผ่านมาเนื่องจาก Android มีการพัฒนาฉันได้ย้ายไปที่ ContentProvider เนื่องจากประหยัดเวลาและช่วยให้คุณทำสิ่งต่างๆได้มากขึ้น ตอนนี้ฉันใช้มันอย่างกว้างขวาง เมื่อคุณเขียนคลาส Content Provider แล้วชีวิตของคุณจะง่ายขึ้นมาก ด้วย ContentProvider ฉันสามารถจัดการกับ Cursor Loaders, Loader Callbacks และ Bulk Inserts ได้อย่างง่ายดายซึ่งในอดีตฉันต้องเขียนทุกอย่างด้วยตนเองและมันก็ยังทำงานได้ไม่เต็มประสิทธิภาพ โดยเฉพาะอย่างยิ่งเมื่ออัปเดตมุมมองรายการซึ่งตอนนี้ได้รับการอัปเดตโดยอัตโนมัติด้วยวิธีการแจ้งเตือนการเปลี่ยนแปลง () เพียงวิธีเดียว ซึ่งหมายความว่าตอนนี้ฉันไม่ต้องพิมพ์ Listener ของตัวเองและอัปเดตเนื้อหาด้วยตนเองในมุมมองรายการและอะแดปเตอร์ นอกจากนี้ฉันไม่ต้องกังวลเกี่ยวกับการเปิดและปิดฐานข้อมูลหรือกังวลเกี่ยวกับการรั่วไหลของหน่วยความจำ นั่นคือทั้งหมดที่จัดการโดย Content Provider ปัญหาเดียวที่พบบ่อยครั้งคือคุณไม่สามารถทำแบบสอบถามที่ซับซ้อนบางอย่างใน ContentProviders ได้ ในกรณีนี้คุณยังสามารถใช้การสืบค้นข้อมูลดิบและใช้การโต้ตอบด้วยตนเองแบบเก่ากับ sqlite ได้

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

อัปเดต 2017 ตอนนี้ฉันได้เปลี่ยนไปใช้Realmซึ่งเป็นวิธีที่ดีกว่ามากในการใช้ฐานข้อมูลบนทุกแพลตฟอร์ม ใช้เวลาสองสามชั่วโมงในการเรียนรู้และประหยัดเวลานับไม่ถ้วนในอาชีพการพัฒนาแอปของคุณ


ฉันคิดที่จะแปลงรหัสของฉันเป็น Content Provider แต่ตอนนี้ฉันคิดจะเก็บมัน
Mohammed Subhi Sheikh Quroush

ตอนนี้คุณสามารถเพิ่มไลบรารี 'ห้อง' ของ Android
Ravindra Kushwaha

8

1. ผู้ให้บริการเนื้อหาไม่ปลอดภัยต่อเธรด

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

ด้วยวิธีนี้จะมีเพียงหนึ่งเธรดเท่านั้นที่สามารถเข้าถึงวิธีการเหล่านี้ได้

2. เล่นให้ดีเมื่อเขียนเยอะ ๆ

ฉันมีความต้องการในแอปพลิเคชันแผนที่ Serval ใหม่เพื่อนำเข้าข้อมูลจากไฟล์ไบนารีไปยังฐานข้อมูลที่แอปพลิเคชันใช้ภายใน ในการดำเนินการนี้และเล่นได้ดีกับแอปพลิเคชันที่เหลือทางที่ดีที่สุดคือ:

วางไข่เธรดใหม่เพื่อดำเนินการนำเข้าเพื่อไม่ให้เธรดอื่นได้รับผลกระทบในทางลบโดยเฉพาะเธรดที่รับผิดชอบการอัปเดต UI และหยุดชั่วขณะในตอนท้ายของการนำเข้าแต่ละครั้งเพื่อให้เธรดอื่น ๆ ที่ต้องใช้วิธีการซิงโครไนซ์มีโอกาสมากขึ้น

3. ผู้ให้บริการเนื้อหาบังคับให้คุณคิดด้านข้างในบางครั้ง

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

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

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


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

5

ผู้ให้บริการเนื้อหาใช้เมื่อคุณต้องการแบ่งปันข้อมูลของคุณในแอปพลิเคชันต่างๆ

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


3

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


3

ฉันอ่านคำตอบนี้ในขณะที่กำลังมองหาข้อสงสัยเดียวกันจึงคิดที่จะแบ่งปัน มันระบุ -

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

ดังนั้นการใช้ผู้ให้บริการเนื้อหาจึงเป็นความคิดที่ดี


3

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


1

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

วิธีการค้นหาใหม่โดยอัตโนมัติด้วย LoaderManager

ContentObserver สำหรับ SQLite?

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