1. Giới thiệu khái quát
Trên nền móng Android, một áp dụng chẳng thể truy cập trực tiếp (đọc / ghi) dữ liệu của áp dụng khác. Toàn bộ dữ liệu của áp dụng là riêng tư so với áp dụng đó. Mỗi áp dụng đều có thư mục dữ liệu id riêng & vùng bộ nhớ lưu trữ được bảo vệ riêng. Điều này có nghĩa là một áp dụng chẳng thể truy vấn hoặc thao tác dữ liệu của một áp dụng khác. Bên cạnh đó, nếu bạn mong muốn bật áp dụng truy vấn hoặc thao tác dữ liệu của áp dụng khác, bạn cần sử dụng định nghĩa Content Providers. Vậy tất cả chúng ta cùng khám phá nó như vậy nào nhé !
1.1 Định nghĩa :
Content provider là một thành phần để làm chủ truy cập dữ liệu, nó phân phối các cách thức khác nhau để các áp dụng có thể truy cập dữ liệu từ một áp dụng khác bằng cách dùng ContentResolver. Content Provider có thể giúp cho một áp dụng làm chủ quyền truy cập đến dữ liệu được lưu bởi áp dụng đó, hoặc các áp dụng khác, & này là một phương pháp để ta có thể chia sẻ dữ liệu cho các áp dụng khác nhau. Hình dưới đây trình diễn cho việc cách content providers làm chủ việc truy cập tới bộ nhớ lưu trữ
Content Provider điều phối việc truy cập tới bỗ lưu trữ dữ liệu thông qua các API & các component như hình dưới, nó bao gồm
- Chia sẻ dữ liệu từ áp dụng của bán tới các áp dụng khác
- Gửi dữ liệu sang widget
- Trả về một kết quả đề xuất khi search cho áp dụng của các bạn thông qua Seach Framework sử dụng
SearchRecentSuggestionsProvider
- Ăn nhập dữ liệu của áp dụng với server bằng cách dùng
AbstractThreadedSyncAdapter
- Tải dữ liệu lên UI sử dụng
CursorLoader
Content Provider hoạt động rất giống với một DataBase, bạn có thể truy vấn, căn chỉnh bài viết, cũng như là thêm xóa các bài viết sử dụng các cách thức: insert(), cập nhật(), delete(), query().
2. Sử dụng Content Provider
Để sử dụng Content Provider ta bắt chước các bước sau:
- Xác nhận kiểu dữ liệu
- Xác nhận Uniform Resource Identifier (URI)
- Khai báo Content Provider trong manifest
- Implement lớp ContentProvider & các cách thức được yêu cầu.
Các cách thức cần được Override trong lớp Content Provider:
- onCreate(): Công thức này được gọi khi Provider được khởi đầu, nếu tiến trình khởi tạo nên công trả về true, trái lại là false
- query(): Công thức nhận yêu cầu từ Client. Kết quả được trả về như một đối tượng Cursor.
- insert(): Công thức chèn một dòng dữ liệu mới vào Content Provider.
- delete(): Công thức xóa một dòng dữ liệu đã tồn tại.
- cập nhật(): Công thức update một dòng dữ liệu nào đó đã tồn tại.
- getType(): Công thức trả về kiểu MIME của dữ liệu tại các URI.
2.1 Content URI
Content URI là một URI định danh dữ liệu trong một provider. Content URI bao gồm kí hiệu tên của toàn thể provider & một tên chỉ tới một bảng. Khi bạn gọi một cách thức truy cập tới bảng trong provider thì Content URI của bảng này là sẽ là một tham số. Để truy vấn data qua provider, ta sẽ sử dụng URI có định dạng như sau:
content
:
- content: luôn là content://
- authority: một xâu để xác nhận tên của Content Provider, chẳng hạn như contact, browser,…
- path: có thể không có hoặc được chia làm nhiều phần, & được phân cách bằng gạch chéo “/”, dùng để định ra các thành phần con của dữ liệu. Chẳng hạn như để lấy danh mục các liên hệ trong danh bạ thì URI sẽ là content://contacts/people.
- id: chỉ định rõ một bản ghi trong tập hợp dữ liệu, mỗi bản ghi sẽ được đánh dấu id là một số duy nhất.
Một số chẳng hạn về URI:
- Content://media/internal/images – trả về Menu toàn bộ các ảnh lưu trong thiết bị
- Content://contact/people – Trả về menu toàn bộ các tên trong danh bạ
- Content://contact/people/45 – Trả về một kết quả danh bạ có ID là 45
Trong bài này, mình sẽ chỉ dẫn các bạn tự tạo một Content URI & sử dụng nó cùng với Content Provider để truy xuất dữ liệu từ DataBase nhé:
3. Tạo Database class
Trước hết, bạn cần tạo một SQLite Database, trước nhất ta khởi tạo các giá trị setup của DB như phiên bản database, database name, sau đó cập nhật ở trong constructor sử dụng các giá trị vừa khởi tạo đó như sau:
public
class
TutListDatabase
extends
SQLiteOpenHelper
{
private
static
final
String DEBUG_TAG = "TutListDatabase"
;
private
static
final
int
DB_VERSION = 1
;
private
static
final
String DB_NAME = "tutorial_data"
;
public
TutListDatabase
(Context context)
{
super
(context, DB_NAME, null
, DB_VERSION);
}
public
void
onCreate
(SQLiteDatabase db)
{
}
public
void
onUpgrade
(SQLiteDatabase db,
int
oldVersion, int
newVersion) {
}
3.1 Định dạng Database Schema
Giả sử dữ liệu của các bạn có các trường: title & url & id, đoạn code sau sẽ khai báo tạo một bảng với các thông số kỹ thuật trên
public
static
final
String
TABLE_TUTORIALS
= "tutorials"
;
public
static
final
String
ID
= "_id"
;
public
static
final
String
COL_TITLE
= "title"
;
public
static
final
String
COL_URL
= "url"
;
private
static
final
String
CREATE_TABLE_TUTORIALS
= "create table "
+ TABLE_TUTORIALS
+ " ("
+ ID
+ " integer primary key autoincrement, "
+ COL_TITLE
+ " text not null, "
+ COL_URL
+ " text not null);"
;
private
static
final
String
DB_SCHEMA
= CREATE_TABLE_TUTORIALS
;
3.2 Tạo Database
Để tạo DB, bên trong hàm onCreate(). đã sẽ chạy đoạn string DB_SCHEMA như là một câu lệnh SQL để tạo nên một bảng theo như những gì ta đã định dạng ở bước trước
public
void
onCreate
(SQLiteDatabase db)
{
db.execSQL(DB_SCHEMA);
}
3.3 Tạo lớp Content Provider
Ta sẽ tạo một lớp TutListProvider kế thừa ContentProvider & tạo một instance của TutListDatabase ở bên trong hàm onCreate():
public
class
TutListProvider
extends
ContentProvider
{
private
TutListDatabase mDB;
public
boolean
onCreate
()
{
mDB = new
TutListDatabase(getContext());
return
true
;
}
3.4 Khái niệm URI & các constant
Chẳng hạn, ta sẽ tạo nên một URI với tên & định dạng như sau
content
:
Để sử dụng URI này, ta sẽ cần khái niệm một vài constant để xác nhận dữ liệu nào ta sẽ truy xuất:
private
static
final
String AUTHORITY = "com.mamlambo.tutorial.tutlist.data.TutListProvider"
;
public
static
final
int
TUTORIALS = 100
;
public
static
final
int
TUTORIAL_ID = 110
;
private
static
final
String TUTORIALS_BASE_PATH = "tutorials"
;
public
static
final
Uri CONTENT_URI = Uri.parse("content://"
+ AUTHORITY
+ "/"
+ TUTORIALS_BASE_PATH);
public
static
final
String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ "/mt-tutorial"
;
public
static
final
String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/mt-tutorial"
;
Để xác nhận kiểu của địa chỉ URI được truyền vào content provider, bạn có thể tạo class UriMatcher để xác nhận đúng đắn URI pattern nào được Content provider trợ giúp, UriMatcher
private
static
final
UriMatcher sURIMatcher = new
UriMatcher(
UriMatcher.NO_MATCH);
static
{
sURIMatcher.addURI(AUTHORITY, TUTORIALS_BASE_PATH, TUTORIALS);
sURIMatcher.addURI(AUTHORITY, TUTORIALS_BASE_PATH + "/#"
, TUTORIAL_ID);
}
4. Giải quyết các câu lệnh truy xuất
Content provider có một vài method cần được kế thừa. Nhưng trong trường hợp này ta chỉ cần sử dụng đến hàm query():
private
static
final
UriMatcher sURIMatcher = new
UriMatcher(
UriMatcher.NO_MATCH);
static
{
sURIMatcher.addURI(AUTHORITY, TUTORIALS_BASE_PATH, TUTORIALS);
sURIMatcher.addURI(AUTHORITY, TUTORIALS_BASE_PATH + "/#"
, TUTORIAL_ID);
}
5. Đăng kí Content Provider
Ta sẽ cần đăng kí provider trong manifest cũng giống như activity
<
provider
android:authorities
="com.mamlambo.tutorial.tutlist.data.TutListProvider"
android:multiprocess
="true"
android:name
="com.mamlambo.tutorial.tutlist.data.TutListProvider"
>provider
>
6. Kết luận
Cảm ơn các bạn đã đọc nội dung của http://phptravels.vn/, hi vọng những học thức trong nội dung có thể giúp ích được ít nhiều trong việc làm & tiến trình học hành của chúng ta.
Ebook xem qua: