บทแนะนำ Android สำหรับผู้เริ่มต้นตอนที่ 4: ผู้ให้บริการเนื้อหา



บทแนะนำ Android นี้กล่าวถึงแนวคิดของผู้ให้บริการเนื้อหา เป็นส่วนประกอบสำคัญของ Android ซึ่งอำนวยความสะดวกในการแลกเปลี่ยนข้อมูลในระบบ Android

ในแบบฝึกหัด Android สำหรับผู้เริ่มต้นก่อนหน้านี้เราได้พูดถึงองค์ประกอบพื้นฐานสามประการแรกของ Android: กิจกรรม , เจตนา และ บริการ . บทความนี้เป็นบทความที่ 4 ในบทแนะนำ Android สำหรับผู้เริ่มต้นชุดนี้และกล่าวถึงผู้ให้บริการเนื้อหาซึ่งเป็นอีกองค์ประกอบที่สำคัญมากของระบบ Android

ผู้ให้บริการเนื้อหาเป็นคนกลางของระบบ Android ซึ่งอำนวยความสะดวกในการแลกเปลี่ยนข้อมูลระหว่างแอปพลิเคชัน Android ต่างๆ ให้เราดูรายละเอียดเล็กน้อยในบทช่วยสอน Android นี้





บทแนะนำ Android สำหรับผู้เริ่มต้น -4 โบนัส: ดาวน์โหลด Content Provider Code ที่นี่ . คุณต้องการรหัสนี้เมื่อคุณผ่านบทช่วยสอนแล้ว! :)

[dl url =” #” class =” eModal eModal-6″ title =” รหัสดาวน์โหลด” desc =”” type =”” align =”” for =” download”]



บทช่วยสอน Android: ผู้ให้บริการเนื้อหา

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

นี่คือตัวอย่างบางส่วนของผู้ให้บริการเนื้อหาเริ่มต้นใน API ของระบบ Android:

บทช่วยสอน Android: ผู้ให้บริการเนื้อหาเริ่มต้นในระบบ Android



ผู้ให้บริการเนื้อหาเหล่านี้อนุญาตให้ผู้ใช้นามธรรมจากฐานข้อมูลพื้นฐาน โดยทั่วไปผู้ให้บริการเนื้อหาใช้ SQLite เพื่อจัดเก็บฐานข้อมูลพื้นฐาน

ให้เราใช้ตัวอย่างที่เป็นประโยชน์ของแอปพลิเคชั่น Facebook เก่า ๆ ที่ช่วยให้เราลดความซับซ้อนในการสอน Android ก่อนหน้านี้ได้เช่นกัน!

ทุกคนมีช่วงเวลาหนึ่งในชีวิตโซเชียลเน็ตเวิร์กอัปโหลดรูปไปยังไทม์ไลน์ Facebook ของคุณใช่ไหม! คุณจะทำอย่างไรมันได้หรือไม่?

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

ได้อ่านบทความก่อนหน้าของ ชุดบทช่วยสอน Android คุณรู้เกี่ยวกับกิจกรรมและเจตนาดังนั้นคุณรู้ว่านี่คือสิ่งที่เกิดขึ้น:

Facebook Wall ของคุณคือ“ กิจกรรม” เมื่อคุณคลิกที่ปุ่มภาพถ่าย 'ความตั้งใจ' จะถูกส่งผ่านซึ่งจะสื่อถึงข้อความและ 'ผู้ให้บริการเนื้อหา' (คลังภาพ) จะเปิดขึ้น รูปภาพถูกอัปโหลดโดยใช้การอัปโหลดเครือข่าย 'SERVICE'

ดูวิดีโอถ่ายทอดสดนี้เพื่อทราบว่า Content Provider ทำงานอย่างไรในแอปพลิเคชัน Facebook ของคุณ

สถาปัตยกรรม mvc ใน java พร้อมไดอะแกรม

เหตุใดระบบ Android จึงต้องการผู้ให้บริการเนื้อหา

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

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

ฉันต้องการผู้ให้บริการเนื้อหาหรือไม่?

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

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

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

ผู้ให้บริการเนื้อหาสนับสนุนการดำเนินการอะไรบ้าง

ผู้ให้บริการเนื้อหาสนับสนุนการดำเนินการพื้นฐานดังต่อไปนี้:

หนึ่ง) การสอบถาม: เคียวรี Content Provider สำหรับอ็อบเจ็กต์ทั้งหมดโดยยึดตาม URI ที่ระบุ

2) ลบ: ลบอ็อบเจ็กต์ที่ระบุจากฐานข้อมูลของ Content Provider

3) อัปเดต: ทำการอัพเดตอ็อบเจ็กต์ในฐานข้อมูล

4) แทรก: แทรกวัตถุใหม่ในฐานข้อมูล

ขั้นตอนในการดำเนินการใน Content Provider

ขั้นตอนที่ 1: การเข้าถึงผู้ให้บริการเนื้อหา

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

แอปพลิเคชันที่ต้องการเข้าถึงฐานข้อมูลจะต้องประกาศสิ่งนี้และขอสิทธิ์ในไฟล์รายการ สิ่งนี้จะกล่าวถึงโดยละเอียดในบทแนะนำ Android ที่ตามมาของเรา

URI เนื้อหา

URI เนื้อหาเป็นหนึ่งในอาร์กิวเมนต์ที่ใช้ในการระบุข้อมูลในผู้ให้บริการ มีสี่ส่วน:

หนึ่ง) โครงการ: โครงร่างสำหรับผู้ให้บริการเนื้อหามีค่าคงที่: 'เนื้อหา'

2) ผู้มีอำนาจ: เป็นชื่อสัญลักษณ์ของผู้ให้บริการและไม่ซ้ำกันสำหรับแต่ละราย นี่คือวิธีที่เราแยกผู้ให้บริการเนื้อหาที่ต้องการออกจากรายการจำนวนมาก

3) เส้นทาง: เส้นทาง ช่วยแยกแยะข้อมูลที่ต้องการจากฐานข้อมูลทั้งหมด . ตัวอย่างเช่นผู้ให้บริการเนื้อหาบันทึกการโทรแยกความแตกต่างระหว่างสายที่ไม่ได้รับสายที่ได้รับ ฯลฯ โดยใช้เส้นทางที่แตกต่างกัน

4) ID: ไม่ใช่องค์ประกอบบังคับและอาจไม่มีอยู่ใน URI แต่ถ้ามีอยู่ควรเป็นตัวเลข ตัวอย่างเช่น หากคุณต้องการเข้าถึงไฟล์เพลงเฉพาะจาก Media Content Provider ของคุณคุณจะต้องระบุ ID ด้วย .

กระบวนการ

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

URI มีสองประเภท:

นอกจากนี้ URI สามารถมีข้อมูล จำกัด ได้เช่นกัน

ขั้นตอนที่ 2: วิธีดึงข้อมูลจากผู้ให้บริการเนื้อหา

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

ทั้งหมดนั้นเป็นแอปพลิเคชัน (ที่ต้องการเข้าถึงฐานข้อมูลนี้) ต้องทำคือขออนุญาตนี้

ตามที่กล่าวไว้ก่อนหน้านี้ในบทช่วยสอน Android นี้ การดำเนินการสี่อย่างสามารถทำได้โดยใช้ผู้ให้บริการเนื้อหา . เราจะไปดูทีละคน

การค้นหา

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

นี่คืออาร์กิวเมนต์ที่ใช้ในการสืบค้น:

หนึ่ง) เกลียด : ทำงานได้ตรงตามที่อธิบายไว้ข้างต้น

2) การฉายภาพ: แบบสอบถามควร ส่งคืนชุดคอลัมน์จากตารางฐานข้อมูลทั้งหมด . สิ่งนี้เรียกว่าการฉายภาพ การผ่าน null จะส่งคืนคอลัมน์ทั้งหมดซึ่งไม่มีประสิทธิภาพ

3) เงื่อนไขการเลือก: ถึง ตัวกรองประกาศว่าจะส่งคืนแถวใด จัดรูปแบบเป็นคำสั่ง SQL WHERE (ไม่รวม WHERE เอง) การผ่าน null จะส่งคืนแถวทั้งหมดสำหรับ URI ที่กำหนด

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

4) อาร์กิวเมนต์การเลือก: คุณอาจรวม“? s” ไว้ในส่วนที่เลือกซึ่งจะถูกแทนที่ด้วยค่าจาก selectionArgs ตามลำดับที่ปรากฏในส่วนที่เลือก

5) SortOrder: SQL ORDER BY clause (ไม่รวม ORDER BY เอง) การผ่าน null จะดึงผลลัพธ์ซึ่งอาจไม่เรียงลำดับ

ตัวอย่างรหัสสำหรับการสืบค้น:

  • ค้นหาหมายเลขโทรศัพท์ในรายชื่อ
เคอร์เซอร์เคอร์เซอร์ = contentresolver.query (ContactsContract.Contacts.CONTENT_URI, null, null, null, null) int count = cursor.getCount () if (count> 0) {String contactDetails = '' while (cursor.moveToNext ()) { String columnId = ContactsContract.Contacts._ID int cursorIndex = cursor.getColumnIndex (columnId) String id = cursor.getString (cursorIndex) String name = cursor.getString (cursor .getColumnIndex (ContactsContract.Contacts.DISPLAY_NAME)) int numCount = (cursor.getString (cursor .getColumnIndex (ContactsContract.Contacts.HAS_PHONE_NUMBER))) if (numCount> 0) {Cursor phoneCursor = contentresolver.query (ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, CommonDataKinds.Phone '? , สตริงใหม่ [] {id}, null) ในขณะที่ (phoneCursor.moveToNext ()) {String phoneNo = phoneCursor.getString (phoneCursor .getColumnIndex (ContactsContract.CommonDataKinds. Phone.NUMBER)) contactDetails + = 'Name:' + name + ', เบอร์โทรศัพท์:' + phoneNo + ''} phoneCursor.close ()}}}

การแทรก

ให้เราสมมติว่าคุณต้องการแทรกรายชื่อใหม่ในสมุดที่อยู่ของคุณ วัตถุ ContentValues ใช้เพื่อทำการแทรกเหล่านี้ คีย์ออบเจ็กต์ ContentValue และคอลัมน์ Content Provider ต้องตรงกันเพื่อให้บรรลุสิ่งนี้ นี่คือตัวอย่างสำหรับสิ่งนี้:

ตัวอย่างรหัสสำหรับการแทรก:

  • การดำเนินการคือการใส่รายการใหม่ชื่อ“ ราชนิกันต์” และหมายเลข“ 9988999888”
// ปฏิบัติการ ArrayList ops = ArrayList ใหม่ () int rawContactInsertIndex = ops.size () ops.add (ContentProviderOperation.newInsert (RawContacts.CONTENT_URI) .withValue (RawContacts.ACCOUNT_TYPE, null) .withValue (RawContacts.ACCOUNT) ()) ops.add (ContentProviderOperation .newInsert (Data.CONTENT_URI). withValueBackReference (Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue (Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) .withValue (โครงสร้าง) .withValue (โครงสร้าง). ) ops.add (ContentProviderOperation.newInsert (Data.CONTENT_URI). withValueBackReference (Data.RAW_CONTACT_ID, rawContactInsertIndex) .withValue (Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) .withValue (Phone.NUMPEal999”. , Phone.TYPE_MOBILE) .build ()) getContentResolver (). applyBatch (ContactsContract.AUTHORITY, ops)

การอัปเดต

ในการอัพเดตผู้ให้บริการเนื้อหาจะใช้อาร์กิวเมนต์ต่อไปนี้:

หนึ่ง) เกลียด: URI ของผู้ให้บริการเนื้อหา

fibonacci ใน c ++

2) ContentValues: ซึ่งประกอบด้วยค่าที่จะแทนที่ข้อมูลที่มีอยู่

3) เงื่อนไขการเลือก: สิ่งนี้สามารถช่วยเลือกระเบียนเฉพาะที่จะอัปเดต

4) อาร์กิวเมนต์การเลือก: คุณอาจรวม“? s” ไว้ในส่วนที่เลือกซึ่งจะถูกแทนที่ด้วยค่าจาก selectionArgs ตามลำดับที่ปรากฏในส่วนที่เลือก

อีกครั้ง คีย์ของออบเจ็กต์ ContentValues ​​ต้องตรงกับคอลัมน์ใน Content Provider มิฉะนั้นการอัปเดตจะไม่เกิดขึ้น

ตัวอย่างรหัสสำหรับการอัปเดต:

  • การอัปเดตหมายเลขโทรศัพท์ที่ชื่อ“ ราชนิกันต์”
สตริงที่ = ContactsContract.Data.DISPLAY_NAME + '=? 'String [] params = new String [] {“ Rajnikant”} ArrayList ops = new ArrayList () ops.add (ContentProviderOperation.newUpdate (ContactsContract.Data.CONTENT_URI) .withSelection (โดยที่ params) .withValue (ContactsContract.CommonDataKinds. Phone.NUMBER,“ 9876543210”) .build ()) getContentResolver (). applyBatch (ContactsContract.AUTHORITY, ops)

การลบ

การลบใช้อาร์กิวเมนต์เดียวกับการอัปเดตโดยยกเว้นอาร์กิวเมนต์ ContentValues ​​ซึ่งไม่จำเป็นเนื่องจากจะไม่มีค่าทดแทนใด ๆ

ตัวอย่างรหัสสำหรับการลบ:

  • ลบผู้ติดต่อโดยที่ชื่อ“ Rajnikant”
สตริงที่ = ContactsContract.Data.DISPLAY_NAME + '=? 'String [] params = new String [] {“ Rajnikant”} ArrayList ops = new ArrayList () ops.add (ContentProviderOperation.newDelete (ContactsContract.RawContacts.CONTENT_URI) .withSelection (where, params) .build ()) getContentResolver ( ) .applyBatch (ContactsContract.AUTHORITY, ops)

ในกรณีของการดำเนินการแทรก URI ต้องเป็นไดเร็กทอรี ในกรณีอื่น ๆ ทั้งหมด URI สามารถเป็นได้ทั้ง ID ตามหรือตามไดเร็กทอรี

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

คุณมีข้อสงสัยในบทช่วยสอน Android นี้หรือไม่? ถามเรา.

มีความสุขในการเรียนรู้!

ทรัพยากรต่อไปนี้ถูกใช้ในการสร้างบทช่วยสอน Android นี้! นักพัฒนา Android อย่างเป็นทางการ , Edureka.in

คุณอาจชอบโพสต์ที่เกี่ยวข้องเหล่านี้: