loading...

Content Provider trong Android

02:08:08 - 25/07/2018 - admin

Content Provider quản lý truy cập vào một kho dữ liệu. Content Provider là bộ phận của một ứng dụng Android, nó thường cung cấp UI của chính mình để làm việc cùng dữ liệu. Với Content Provider trong Android https://www.devpro.edu.vn/full-tai-lieu-tu-hoc-lap-trinh-android-tu-co-ban-nang-cao chúng ta sẽ đi tìm hiểu những nội dung chính sau đây:

  • Content URIs
  • Cách Content Provider hoạt động.
  • API bạn sử dụng để truy xuất dữ liệu từ Content Provider.
  • API bạn sử dụng để chèn, cập nhật, hoặc xóa dữ liệu trong Content Provider.

Thành phần content provider cung cấp dữ liệu từ một ứng dụng cho người khác theo yêu cầu. Các yêu cầu như vậy được xử lý bằng các phương thức của lớp ContentResolver. Nhà cung cấp nội dung có thể sử dụng các cách khác nhau để lưu trữ dữ liệu của nó và dữ liệu có thể được lưu trữ trong cơ sở dữ liệu, trong tệp hoặc thậm chí qua mạng.

Content Provider cho phép bạn tập trung nội dung vào một nơi và có nhiều ứng dụng khác nhau truy cập nội dung khi cần. Content Provider hoạt động rất giống cơ sở dữ liệu nơi bạn có thể truy vấn, chỉnh sửa nội dung, cũng như thêm hoặc xóa nội dung bằng phương thức insert (), update (), delete () và query (). Trong hầu hết các trường hợp, dữ liệu này được lưu trữ trong cơ sở dữ liệu SQlite .

Content Provider được triển khai dưới dạng lớp con của lớp ContentProvider và phải triển khai bộ API tiêu chuẩn cho phép các ứng dụng khác thực hiện giao dịch.

public class My Application extends  ContentProvider {

}

Content URIs

Để truy vấn Content Provider, bạn chỉ định chuỗi truy vấn dưới dạng một URI có định dạng sau –

<prefix>://<authority>/<data_type>/<id>

Dưới đây là chi tiết về các phần khác nhau của URI

prefix Điều này luôn được đặt thành nội dung: //
authority Điều này chỉ định tên của nhà cung cấp nội dung, ví dụ như danh bạ , trình duyệt,…com.tutorialspoint.statusprovider
data_type Điều này cho biết loại dữ liệu mà nhà cung cấp cụ thể này cung cấp. Ví dụ: nếu bạn đang nhận được tất cả địa chỉ liên hệ từ nhà cung cấp nội dung Danh bạ thì đường dẫn dữ liệu sẽ là người và URI trông giống như nội dung này : // contacts / people
ID Điều này quy định cụ thể hồ sơ yêu cầu. Ví dụ: nếu bạn đang tìm số liên lạc 5 trong nhà cung cấp nội dung Danh bạ thì URI sẽ trông giống như nội dung này : // contacts / people / 5 .

Tạo Content Provider

Có 5 bước để tạo Content Provider:

Bước 1: Bạn cần phải tạo một lớp Content Provider mở rộng ContentProviderbaseclass.

Bước 2: Bạn cần xác định địa chỉ URI của Content Provider sẽ được sử dụng để truy cập nội dung.

Bước 3: Tiếp theo, bạn sẽ cần phải tạo cơ sở dữ liệu của riêng bạn để giữ nội dung. Thông thường, Android sử dụng cơ sở dữ liệu và khung công tác SQLite cần ghi đè phương thức onCreate () sẽ sử dụng phương thức SQLite Open Helper để tạo hoặc mở cơ sở dữ liệu của nhà cung cấp. Khi ứng dụng của bạn được khởi động, trình xử lý onCreate () của mỗi Content Provider được gọi trên luồng ứng dụng chính.

Bước 4: Bạn sẽ phải triển khai các truy vấn Content Provider để thực hiện các hoạt động cụ thể của cơ sở dữ liệu khác nhau.

Bước 5: Cuối cùng hãy đăng ký Content Provider của bạn trong tệp hoạt động của bạn bằng cách sử dụng thẻ <provider>.

Dưới đây là danh sách các phương pháp bạn cần nhớ trong Content Provider:

  • onCreate (): Phương thức này được gọi khi nhà cung cấp được khởi động.
  • query (): Phương thức này nhận được một yêu cầu từ một máy khách. Kết quả được trả về dưới dạng đối tượng Cursor.
  • insert (): Phương thức này chèn một bản ghi mới vào nhà cung cấp nội dung.
  • delete (): Phương thức này xóa một bản ghi hiện có từ nhà cung cấp nội dung.
  • update (): Phương thức này cập nhật một bản ghi hiện có từ nhà cung cấp nội dung.
  • getType (): Phương thức này trả về kiểu MIME của dữ liệu tại URI đã cho.

API bạn sử dụng để truy xuất dữ liệu từ Content Provider

Ứng dụng của Content Provider có thể chỉ định các quyền mà ứng dụng khác có thể có để truy cập dữ liệu của trình cung cấp đó. Những quyền này đảm bảo rằng người dùng biết một ứng dụng sẽ cố gắng truy cập dữ liệu dựa trên các yêu cầu của Content Provider, các ứng dụng khác yêu cầu.

Như đã lưu ý, Content Provider sẽ yêu cầu quyền android.permission.READ_USER_DICTIONARY để truy xuất dữ liệu từ nó và android.permission.WRITE_USER_DICTIONARY riêng để chèn, cập nhật, hoặc xóa dữ liệu.

Để nhận các quyền cần để truy cập một trình cung cấp, ứng dụng yêu cầu chúng bằng một phần tử <uses-permission> trong tệp bản kê khai của nó. Khi Trình quản lý Gói Android cài đặt các ứng dụng, người dùng phải phê chuẩn tất cả quyền mà ứng dụng yêu cầu. Nếu người dùng phê chuẩn tất cả quyền, khi đó Trình quản lý Gói sẽ tiếp tục cài đặt nếu người dùng không phê chuẩn chúng, Trình quản lý Gói sẽ hủy bỏ việc cài đặt.

Phần tử <uses-permission> sau yêu cầu quyền truy cập:

   <uses-permission android:name=”android.permission.READ_USER_DICTIONARY”>

  1. Chèn, cập nhật, hoặc xóa dữ liệu trong Content Provider

Giống như cách bạn truy xuất dữ liệu từ một trình cung cấp, bạn cũng có thể sử dụng tương tác giữa một máy khách cung cấp và ContentProvider của trình cung cấp để sửa đổi dữ liệu. Bạn gọi một phương pháp ContentResolver với các tham đối được chuyển sang phương pháp ContentProvider tương ứng. Trình cung cấp và máy khách cung cấp sẽ tự động xử lý bảo mật và truyền thông liên tiến trình.

  • Chèn dữ liệu

Để chèn dữ liệu vào Content Provider, bạn gọi ContentResolver.insert(): Phương pháp này chèn một hàng mới vào trình cung cấp và trả về một URI nội dung cho hàng đó. Đoạn mã HTML này cho biết cách chèn một từ mới vào Trình cung cấp Từ điển Người dùng:

// Defines a new Uri object that receives the result of the insertion

Uri mNewUri;

// Defines an object to contain the new values to insert

ContentValues mNewValues = new ContentValues();

/*

* Sets the values of each column and inserts the word. The arguments to the “put”

* method are “column name” and “value”

*/

mNewValues.put(UserDictionary.Words.APP_ID, “example.user”);

mNewValues.put(UserDictionary.Words.LOCALE, “en_US”);

mNewValues.put(UserDictionary.Words.WORD, “insert”);

mNewValues.put(UserDictionary.Words.FREQUENCY, “100”);

mNewUri = getContentResolver().insert(

   UserDictionary.Word.CONTENT_URI,   // the user dictionary content URI

   mNewValues                          // the values to insert

);

Dữ liệu cho hàng mới đi vào trong một đối tượng ContentValues đơn lẻ, đối tượng này có dạng tương tự như con chạy một hàng. Các cột trong đối tượng này không cần có cùng kiểu dữ liệu, và nếu hoàn toàn không muốn chỉ định một giá trị, bạn có thể đặt một cột thành null bằng cách sử dụng ContentValues.putNull().

Đoạn mã HTML không thêm cột _ID vì cột này được tự động duy trì. Trình cung cấp sẽ gán một giá trị duy nhất _ID cho mỗi hàng được thêm. Các trình cung cấp thường sử dụng giá trị này làm khóa chính của bảng.

URI nội dung được trả về trong newUri sẽ xác định hàng mới thêm, có định dạng như sau:

content://user_dictionary/words/<id_value>

<id_value> là nội dung của _ID cho hàng mới. Hầu hết các trình cung cấp đều có thể tự động phát hiện dạng URI nội dung này rồi thực hiện thao tác được yêu cầu trên hàng cụ thể đó.

Để nhận giá trị _ID từ Uri được trả về, hãy gọi ContentUris.parseId().

  • Cập nhật dữ liệu

Để cập nhật, bạn sử dụng một đối tượng ContentValues với các giá trị được cập nhật giống như cách bạn làm với việc chèn, và các tiêu chí lựa chọn giống như cách bạn làm với truy vấn. Phương pháp máy khách mà bạn sử dụng là ContentResolver.update(). Bạn chỉ cần thêm các giá trị vào đối tượng ContentValues cho các cột mà bạn đang cập nhật. Nếu bạn muốn xóa các nội dung của một cột, hãy đặt giá trị thành null.

Đoạn mã HTML sau thay đổi tất cả hàng với cột bản địa có ngôn ngữ “en” thành cột có bản địa là null. Giá trị trả về là số hàng đã được cập nhật:

// Defines an object to contain the updated values

ContentValues mUpdateValues = new ContentValues();

// Defines selection criteria for the rows you want to update

String mSelectionClause = UserDictionary.Words.LOCALE +  “LIKE ?”;

String[] mSelectionArgs = {“en_%”};

// Defines a variable to contain the number of updated rows

int mRowsUpdated = 0;

/*

* Sets the updated value and updates the selected words.

*/

mUpdateValues.putNull(UserDictionary.Words.LOCALE);

mRowsUpdated = getContentResolver().update(

   UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI

   mUpdateValues                       // the columns to update

   mSelectionClause                    // the column to select on

   mSelectionArgs                      // the value to compare to

);

Bạn cũng nên thanh lọc thông tin đầu vào của người dùng khi gọi ContentResolver.update(). Để tìm hiểu thêm về điều này, hãy đọc phần Bảo vệ trước mục nhập độc hại.

  • Xóa dữ liệu

Xóa tương tự như truy xuất dữ liệu hàng: bạn chỉ định các tiêu chí lựa chọn cho hàng mà bạn muốn xóa và phương pháp máy khách trả về số hàng được xóa. Đoạn mã HTML sau xóa các hàng có appid khớp với “user”. Phương pháp sẽ trả về số hàng được xóa.

// Defines selection criteria for the rows you want to delete

String mSelectionClause = UserDictionary.Words.APP_ID + ” LIKE ?”;

String[] mSelectionArgs = {“user”};

// Defines a variable to contain the number of rows deleted

int mRowsDeleted = 0;

// Deletes the words that match the selection criteria

mRowsDeleted = getContentResolver().delete(

   UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI

   mSelectionClause                    // the column to select on

   mSelectionArgs                      // the value to compare to

);

Bài viết liên quan:

Ý kiến bạn đọc

Bình luận qua Disqus Facebook