Content Provider

Preview:

DESCRIPTION

Cung cap noi dung

Citation preview

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 ).

Recommended