Beginning Android for Application - Chapter 7: Content Providers

Chia sẻ dữ liệu trong android.

Trong android, việc sử dụng content provider là cách được khuyên dùng trong việc

chia sẻ dữ liệu thông qua các package. Bạn hãy tưởng tượng content provider như là một data

store. Content Provider có hành vi rất giống như database. Bạn có thể tạo các query, edit nội

dung của content cũng như add, delete content. Tuy nhiên không giống như database, một

content provider có thể sử dụng nhiều cách khác nhau để lưu trữ dữ liệu. Dữ liệu có thể được

lưu trữ trong database, trong file hay thậm chí qua network.

Android cung cấp nhiều tính năng hữu dụng của content provider đó là :

 Browser: Lưu trữ các thông tin như browser bookmarks, browser history

 CallLog: Lưu trữ data như là missed call, call detail

 Contacts: Lưu trữ danh bạ

 MediaStore: Lưu trữ media file như audio, video , images

 Setting: Lưu trữ các thiết lập về setting và preferences.

pdf19 trang | Chuyên mục: Android | Chia sẻ: dkS00TYs | Lượt xem: 2593 | Lượt tải: 1download
Tóm tắt nội dung Beginning Android for Application - Chapter 7: Content Providers, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Thangit14.blogspot.com Thangit14@gmail.com 
1 
Chương 7: Content Providers. 
Chia sẻ dữ liệu trong android. 
Trong android, việc sử dụng content provider là cách được khuyên dùng trong việc 
chia sẻ dữ liệu thông qua các package. Bạn hãy tưởng tượng content provider như là một data 
store. Content Provider có hành vi rất giống như database. Bạn có thể tạo các query, edit nội 
dung của content cũng như add, delete content. Tuy nhiên không giống như database, một 
content provider có thể sử dụng nhiều cách khác nhau để lưu trữ dữ liệu. Dữ liệu có thể được 
lưu trữ trong database, trong file hay thậm chí qua network. 
Android cung cấp nhiều tính năng hữu dụng của content provider đó là : 
 Browser: Lưu trữ các thông tin như browser bookmarks, browser history… 
 CallLog: Lưu trữ data như là missed call, call detail … 
 Contacts: Lưu trữ danh bạ 
 MediaStore: Lưu trữ media file như audio, video , images … 
 Setting: Lưu trữ các thiết lập về setting và preferences. 
Ngoài các built-in content provider, bạn có thể tạo ra các content provider của riêng 
mình. 
Cấu trúc của câu lệnh query: 
 standard_prefix dùng cho content provider luôn là content:// 
 authority: xác định tên của content provider. Ví dụ nếu bạn muốn lấy về các 
Contacts thì authority sẽ là contacts. Còn nếu bạn tạo ra content provider của 
mình thì sẽ là full name của content đó ví dụ như: com.thangit14.provider 
 data path: xác định loại dữ liệu cần lấy về. Ví dụ nếu bạn muốn lấy về tất cả 
contact từ Contacts content provider, thì data path sẽ là people và lúc này URI 
sẽ là : content://contacts/people. 
 id xác định chính xác record mà bạn muốn lấy về. Ví dụ nếu bạn muốn lấy về 
contacts số 2 thì URI sẽ là : content://contacts/people/2 
Bảng dưới đây chỉ ra một số câu query: 
Thangit14.blogspot.com Thangit14@gmail.com 
2 
Sử dụng Content Provider 
Thangit14.blogspot.com Thangit14@gmail.com 
3 
Thangit14.blogspot.com Thangit14@gmail.com 
4 
Ở đây, CursorLoader class thực hiện curser query trong background thread, vì thế sẽ 
không block app UI. 
SimpleCurserAdapter sẽ map cursor đến textviews( image views) được định nghĩa 
trong file xml. Sau đó sẽ map các text view này đến listview của activity bằng phương thức 
setListAdapter(adapter). 
FLAG_REGISTER_CONTENT_OBSERVER đăng kí lắng nghe khi có sự thay đổi của 
content provider. 
Chú ý rằng để được truy cập vào Contacts application, bạn cần phải thêm permission 
READ_CONTACTS trong file AndroidManifest.xml. 
Thangit14.blogspot.com Thangit14@gmail.com 
5 
Sử dụng các Query String đã được định nghĩa trước. 
Bên cạnh việc sử dụng các content như trên, ta cũng có thể sử dụng các query string 
constants như sau: 
Một vài các truy vấn khác là : 
Nếu bạn muốn lấy về 1 record xác định thì có thể sử dụng như sau: 
Hoặc: 
Ngoài việc map dữ liệu vào ListView, bạn có thể hiển thị chúng sử dụng Cursor 
object như sau: 
Thangit14.blogspot.com Thangit14@gmail.com 
6 
Nếu bạn muốn hiển thị số điện thoại, bạn cần query đến content provider thêm lần 
nữa: 
Thangit14.blogspot.com Thangit14@gmail.com 
7 
Projections 
Biến thứ 3 của CursorLoader class xác định có bao nhiêu cột được trả về bởi query, 
biến đó được gọi là projection. Cách đơn giản nhất là bạn để null, hoặc cũng có thể chỉ ra 
chính xác bằng cách tạo ra một bảng chứa tên của các column cần phải trả về. 
Thangit14.blogspot.com Thangit14@gmail.com 
8 
Filtering 
Biến thứ tư của CursorLoader class cho phép bạn xác định câu lệnh where trong 
SQL. 
Bạn cũng có thể set String cần tìm kiếm vào biến thứ 5 như sau: 
Thangit14.blogspot.com Thangit14@gmail.com 
9 
Sorting. 
Biến cuối cùng là Order By trong câu lệnh SQL: 
Tạo ra Content Providers của riêng bạn. 
Việc tạo ra content providers của riêng bạn rất dễ dàng. Bạn chỉ vieecj extend 
ContentProvider class và override các method của nó. 
Trong ví dụ sau, chúng ta sẽ tạo ra một content provider đơn giản lưu trữ sách, dữ liệu 
sẽ được lưu trữ trong database có cấu trúc như Figure 7-3. 
Thangit14.blogspot.com Thangit14@gmail.com 
10 
Thangit14.blogspot.com Thangit14@gmail.com 
11 
Thangit14.blogspot.com Thangit14@gmail.com 
12 
Thangit14.blogspot.com Thangit14@gmail.com 
13 
Thangit14.blogspot.com Thangit14@gmail.com 
14 
Trong ví dụ trên, bạn đã tạo lớp BookksProvider extends từ ContentProvider và 
override các method sau: 
Khi sử dụng content provider bạn được tự do lựa chọn cách lưu trữ dữ liệu, ở đây đã 
sử dụng database để lưu trữ. 
Bạn định nghĩa các hằng trong BookProvider 
Thangit14.blogspot.com Thangit14@gmail.com 
15 
Ở đây UriMatcher object được dùng để parse content URI được truyền vào content 
provider thông qua ContentResolver. Ví dụ như content URI để lấy tất cả các sách là: 
content://com.thangit14.provider.Books/books 
content provider để lấy book có id bằng 5 là 
content://com.thangit14.provider.Books/books/5. 
Nói cách khác UriMatcher được dùng để kiểm tra chuỗi sau content provider name, 
và gán cho nó các giá trị tương ứng. Ở đây books ứng với BOOKS và books/# ứng với 
BOOK_ID. Dấu # đại diện cho một số. 
Vì bạn sử dụng database để lưu trữ dữ liệu nên bạn cần phải sử dụng 
SQLiteOpenHelper class để giúp bạn quản lý database đó. 
Tiếp theo, bạn override method getType() để mô tả duy nhất kiểu dữ liệu cho content 
provider của bạn. Sử dụng UriMatcher, bạn trả về 
vnd.android.cursor.item/vnd.thangit14.books cho một quyển sách và trả về 
vnd.android.cursor.dir/vnd.thangit14.books cho nhiều cuốn sách. 
Sau đó, bạn override method onCreate() để mơi một connection đến database khi 
content provider được start. 
Trong các phương thức insert và delete, mỗi khi thực hiện thành công, bạn gọi 
notifyChange() của ContentResolver. Notify sẽ được update mỗi khi có một dòng được insert 
hay delete. 
Cuối cùng bạn phải đăng kí content provider của bạn với Android bằng cách chỉnh 
sửa AndroidManifest.xml. 
Bạn cần lưu ý rằng phương thức getType() chỉ để xác định tính duy nhất của kiểu dữ 
liệu cho content provider, còn khi bạn lấy dữ thì sẽ tham chiếu đến method query(). 
Thangit14.blogspot.com Thangit14@gmail.com 
16 
Sử dụng Content Provider 
Thangit14.blogspot.com Thangit14@gmail.com 
17 
Thangit14.blogspot.com Thangit14@gmail.com 
18 
Để thêm mới một cuốn sách, bạn tạo một ContentValues sau đó 
truyền vào nó các thông tin về cuốn sách. 
Chú ý rằng vì content provider ở trong cùng một package nên bạn có thể sử dụng 
BooksProvider.Title và BookProvider.ISEN và đường dẫn tương đối của Uri. Nếu bạn muốn 
truy cập content provider từ các package khác nhau, thì bạn phải sử dụng như sau: 
Đề update một cuốn sách thì ta làm như sau: 
Để delete một cuốn sách thì ta làm như sau: 
Để delete toàn bộ sách, bạn chỉ việc bỏ qua id : 
Thangit14.blogspot.com Thangit14@gmail.com 
19 
Cần nhớ: 
 Dùng CursorLoader khi cần lấy về một cursor để thực hiện thao tác với các giá 
trị trả về như là result set 
 Dùng getContentResolver() khi thực hiện các thao tác không cần lấy về result 
set. 
 Dùng ContentValues để đưa các value vào content. 

File đính kèm:

  • pdfBeginning Android for Application - Chapter 7 Content Providers.pdf