Content Provider
www.mobilepro.vnProfessional Programming
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
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
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
Kho dữ liệu ContentProvider
EL9DemoCP
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 đó
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
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…
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.
Mô hình dữ liệu Content Provider
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
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
URIs
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://”
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ạ:
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
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.
Truy vấn 1 ContentProvider
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 đó.
Ví dụ truy vấn 1 bảng
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ợ :
Đọc dữ liệu từ Cusror
Thay đổi dữ liệu ContentProvider
• 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
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
Update dữ liệu• Sử dụng phương thức ContentResolover.update()
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.
Tạo 1 content provider
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
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>
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
Chọn giao diện ContactList.java
Click item -> chuyển sang DetailActivityCustom listview Custom listview
Chọn giao diện ContacEditor
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 ).