Bài 19: content provider trong android – phptravels.vn

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

  1. Chia sẻ dữ liệu từ áp dụng của bán tới các áp dụng khác
  2. Gửi dữ liệu sang widget
  3. 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

  4. Ăn nhập dữ liệu của áp dụng với server bằng cách dùng 

    AbstractThreadedSyncAdapter

  5. 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:

  1. Xác nhận kiểu dữ liệu
  2. Xác nhận Uniform Resource Identifier (URI)
  3. Khai báo Content Provider trong manifest
  4. 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:

  1. 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
  2. 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.
  3. insert(): Công thức chèn một dòng dữ liệu mới vào Content Provider.
  4. delete(): Công thức xóa một dòng dữ liệu đã tồn tại.
  5. cập nhật(): Công thức update một dòng dữ liệu nào đó đã tồn tại.
  6. 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

:
  1. content: luôn là content://
  2. authority: một xâu để xác nhận tên của Content Provider, chẳng hạn như contact, browser,…
  3. 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.
  4. 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:

  1. Content://media/internal/images – trả về Menu toàn bộ các ảnh lưu trong thiết bị
  2. Content://contact/people – Trả về menu toàn bộ các tên trong danh bạ
  3. 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: