Download - Content Provider
![Page 1: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/1.jpg)
Content Provider
www.mobilepro.vnProfessional Programming
![Page 2: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/2.jpg)
Nội dung• Content Provider là gì?• Mô hình dữ liệu• URIs• Truy vấn với Content Provider• Thay đổi dữ liệu Content Provider• Tạo 1 Content Provider
![Page 3: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/3.jpg)
Content Provider là gì?• Có thể hiểu ContentProvider theo 2 cách :
– Là kho dữ liệu mà tất cả các ứng dụng có thể truy cập vàsử dụng ( lưu trữ, đọc, ghi..) như Contacts, Browser, CallLog
– Là cách duy nhất để các ứng dụng chia sẽ dữ liệu vớinhau
• Có 2 loại Content Provider– Content Provider có sẵn của hệ thống– Content Provider do người dùng tự định nghĩa
![Page 4: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/4.jpg)
ContentProvider có sẵn • Hệ điều hành Android đi kèm với 1 kho dữ liệu
dưới dàng ContentProvider– Chủ yếu là các dữ liệu dưới dạng Audio, video,
images, contacts, info…– Nằm trong gói android.provider
• Người dùng có thể sử dụng các câu truy vấn để lấy dữ liệu EL9DemoCP
![Page 5: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/5.jpg)
Kho dữ liệu ContentProvider
EL9DemoCP
![Page 6: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/6.jpg)
Làm sao để public dữ liệu?• Có 2 cách:
– Tạo riêng dữ liệu dưới dạng ContentProvider ( hướng dẫn sau )
– Thêm dữ liệu vào các provider có sẵn ( lưu ý phải cùng kiểu dữ liệu ) và phải thêm permission để ghi dữ liệu vào provider đó
![Page 7: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/7.jpg)
ContentProvider Implementation• Tất cả các lớp ContentProvider đều phải implement ( thực
thi ) 1 interface giống nhau để:– Truy vấn các provider và trả lại dữ liệu– Thêm dữ liệu– Xóa dữ liệu– Chỉnh sửa dữ liệu
• Dữ liệu ContentProvider có thể lưu trữ dưới dạng File hệ thống hoặc SQLite
• Client truy cập dữ liệu ContentProvider thông qua lớp ContentResolver
![Page 8: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/8.jpg)
Demo tại lớp• Tạo 1 Content Provider cho 1 cơ sở dữ liệu
chứa các đối tượng Book . Mô tả : – Đối tượng Book gồm 2 thuộc tính : id & tittle– Content Provider sử dụng SQLite Database để
chứa dữ liệu.– Thực hiện các thao tác thêm, sửa, xóa, truy vấn…
![Page 9: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/9.jpg)
Bài tập tại lớp• Từ 1 ứng dụng khác , truy vấn dữ liệu Book đã
tạo từ Demo trước đó. VD : Show Toast hiểnthị tên đối tượng sách đầu tiên.
• Chú ý : Đã override phương thức query() củaBookProvider.
![Page 10: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/10.jpg)
Mô hình dữ liệu Content Provider
![Page 11: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/11.jpg)
Mô hình dữ liệu• Cấu trúc dữ liệu ContentProvider dưới dạng các
bảng ( giống như database)– Mỗi hàng là 1 bản ghi , mỗi cột là 1 trường ( thuộc
tính) – Mỗi bản ghi đều có trường _ID để phân biệt với các
bản ghi khác
![Page 12: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/12.jpg)
Dữ liệu Cursor• Dữ liệu trả lại khi truy vấn với ContentProvider dưới
dạng Cursor• Sử dụng các phương thức move(int Offset) ,
moveToFirst(), moveToLast(), moveToNext(), moveToPosition(int Position)… để duyệt Cursor
• Để lấy được dữ liệu từ Cursor , bắt buộc phải lấy được columnIndex và biết được kiểu của dữ liệu, sau đó sử dụng các phương thức : getDouble(int columnIndex), getString(int columIndex), ….) để lấy dữ liệu
![Page 13: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/13.jpg)
URIs
![Page 14: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/14.jpg)
URI• Dữ liệu ContentProvider được “show” thông qua
URI ( 1 chuỗi String trỏ đến dữ liệu CP)• Tất cả các URIs trỏ đến dữ liệu ContentProvider
đều bắt đầu với chuỗi “content://”
![Page 15: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/15.jpg)
System URIs• Android định nghĩa hằng số CONTENT_URI cho
tất cả các provider có sẵn trong hệ thống• Ví dụ : URI cho bảng chứa dữ liệu số điện thoại
trong danh bạ và URI cho bảng dữ liệu chứa ảnh các bản ghi trong danh bạ:
![Page 16: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/16.jpg)
Cấu trúc 1 URI
• A : Tiền tố bắt buộc đánh dấu đây là 1 URI trỏ đến dữ liệu CP -> Không được sửa
• B : Đường dẫn đến kho dữ liệu CP -> Duy nhất• C : Tên bảng dữ liệu được yêu cầu• D : ID của bản ghi cần lấy
![Page 17: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/17.jpg)
1 số ContentURI• Contact : ContactsContract.Contacts.CONTENT_URI• Setting : System.Setting.CONTENT_URI• Call Logs : CallLog.Calls.CONTENT_URI• Browser Bookmarks : Browser.BOOKMARKS_URI
• => Chú ý : Cần đăng ký permission trước khi sử dụng.
![Page 18: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/18.jpg)
Truy vấn 1 ContentProvider
![Page 19: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/19.jpg)
Truy vấn ContentProvider• Cần 3 thông tin sau để truy vấn 1 CP:
– URI trỏ đến CP đó– Tên bảng dữ liệu muốn lấy– Kiểu dữ liệu của các thuộc tính ( để lấy dữ liệu từ
Cursor ra )
• Nếu truy vấn để lấy 1 bản ghi thì cần biết ID của bản ghi đó.
![Page 20: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/20.jpg)
Ví dụ truy vấn 1 bảng
![Page 21: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/21.jpg)
Ví dụ truy vấn 1 bản ghi
• Cần biết được ID của bản ghi• Có thể sử dụng các phương thức hỗ trợ :
![Page 22: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/22.jpg)
![Page 23: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/23.jpg)
Đọc dữ liệu từ Cusror
![Page 24: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/24.jpg)
Thay đổi dữ liệu ContentProvider
![Page 25: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/25.jpg)
• Các chức năng hay sử dụng:– Thêm bản ghi mới– Update dữ liệu cho các trường của bản ghi đã tồn tại– Xóa bản ghi
• Bắt buộc phải sử dụng các phương thức của lớp Content Resolver
![Page 26: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/26.jpg)
Các bước thêm bản ghi mới• Khởi tạo 1 đối tượng của lớp ContentValues để chứa dữ
liệu các trường tương ứng ( sử dụng phương thức put ( COLUMN, DATA) )
• Sử dụng phương thức ContentResolover().insert() để thêm dữ liệu vào bảng
![Page 27: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/27.jpg)
Update dữ liệu• Sử dụng phương thức ContentResolover.update()
![Page 28: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/28.jpg)
Xóa bản ghi• Xóa 1 bản ghi :
– Sử dụng phương thức ContentResolver.delete() với URI của 1 bản ghi truyền vào.
• Xóa nhiều bản ghi :– Vẫn sử dụng phương thức ContentResolver.delete()
nhưng với URI trỏ đến bảng dữ liệu.VD: android.provider.Contacts.People.CONTENT_URI– Ngoài ra sử dụng thêm mệnh đề WHERE trong SQL để
xác định xem những bản ghi nào muốn xóa.
![Page 29: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/29.jpg)
Tạo 1 content provider
![Page 30: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/30.jpg)
Các bước tạo ContentProvider• Tạo hệ thống lưu trữ dữ liệu ContentProvider
– > Recommended : Sử dụng SQLite• Tạo 1 lớp extends từ lớp ContentProvider để
thao tác với các phương thức truy cập dữ liệu– Implement 6 phương thức : query(), insert(),
update(), delete(), getType(), onCreate()• Khai báo content provider của ứng dụng trong
AndroidManifest.xml
![Page 31: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/31.jpg)
Khai báo ContentProvider• Mục đích để hệ thống biết content provider mà
bạn xây dựng.• Khai báo trong AndroidManifest.xml sử dụng tag
<provider>
![Page 32: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/32.jpg)
Homework 1• Viết 1 ứng dụng bao gồm 2 activity :
– Activity 1 : Có tên là ContactList.java • Là 1 ListActivity , hiển thị list các danh bạ trong máy. • Khi click vào 1 item trong list sẽ chuyển sang Activity 2.
– Activity 2 : Có tên là ContactEditor.java • Là 1 form chứa giao diện để sửa các thông tin của 1 danh bạ.• Hiển thị dữ liệu của danh bạ tương ứng từ Activity 1 gửi sang ( Bao gồm Tên,
Email, Số điện thoại, avatar… )• Sau khi sửa xong, người dùng click vào button Save để lưu lại, dữ liệu được
update . Chú ý kiểm tra bằng cách mở lại danh bạ trong máy xem thông tin đượcsửa thành công hay chưa.
• Gợi ý : ContentURI của Contact : ContactsContract.Contacts.CONTENT_URI
![Page 33: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/33.jpg)
Chọn giao diện ContactList.java
Click item -> chuyển sang DetailActivityCustom listview Custom listview
![Page 34: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/34.jpg)
Chọn giao diện ContacEditor
![Page 35: Content Provider](https://reader033.vdocuments.net/reader033/viewer/2022042702/55cf8f81550346703b9d0cc3/html5/thumbnails/35.jpg)
Homework2
• Viết 1 ứng dụng hiển thị list các note có trong ứng dụng Notepad ( đã làm từ buổi trước ).