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.
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:
- Beginning Android for Application - Chapter 7 Content Providers.pdf