Content Provider Là Gì Và Nó Thường Được Sử Dụng Để Làm Gì? Android: Content Provider Trong Android – Cộng đồng in ấn

Content Provider Là Gì Và Nó Thường Được Sử Dụng Để Làm Gì? Android: Content Provider Trong Android

Content Provider trong Android

Ở phần 1, chúng ta đã tìm hiểu cách lưu trữ dữ liệu của một ứng dụng trong cơ sở dữ liệu SQLite. Trong trường hợp này, dữ liệu là “tài sản riêng” của ứng dụng và không thể được truy cập bởi các ứng dụng khác trong cùng một thiết bị Android.

Đang xem: Content provider là gì và nó thường được sử dụng để làm gì?

Content Provider cung cấp cơ chế truy cập dữ liệu giữa các ứng dụng khác nhau trên cùng một thiết bị Android. Sử dụng Content Provider giống hình thức giao tiếp client/server trong đó ứng dụng truy cập dữ liệu đóng vai trò là client và Content Provider đóng vai trò là server.

Một Content Provider là một lớp con của lớp android.content.ContentProvider và việc tạo một Content Provider liên quan đến việc thực thi các phương thức sau:

Phương thức
Chức năng

onCreate()
Phương thức này được gọi khi một Content Provider được tạo lần đầu tiên và được dùng để thực thi các nhiệm vụ khởi tạo được yêu cầu bởi Content Provider.

query()
Phương thức này được gọi khi một ứng dụng (client) yêu cầu dữ liệu được nhận từ Content Provider. Dữ liệu nhận được chứa trong một đối tượng Cursor.

insert()
Phương thức này được gọi khi một hàng mới được thêm vào cơ sở dữ liệu Provider.

update()
Phương thức này được gọi khi các hàng tồn tại sẵn cần được cập nhật đại diện cho client (ứng dụng).

delete()
Phương thức này được gọi khi các hàng bị xóa từ một bảng.

getType()
Trả về kiểu MIME của dữ liệu được lưu trữ bởi Content Provider.

Xem thêm: Giấy In Nhiệt K57 ( Máy In Bill K57 Mini, Giá Rẻ Hơn Tới 50%

Content Providers là gì?

Content Providers là một tập dữ liệu được bao bọc trong một custom API để có thể cho phép đọc và ghi. Nó hoạt động như một interfacae cho phép bạn lưu trữ và truy xuất dữ liệu từ một nguồn lưu trữ dữ liệu (repository). Và nó đối tượng này cũng cho phép bạn chia sẻ dữ liệu giữa các ứng dụng khác nhau. Content Providers tách lớp ứng dụng khỏi lớp dữ liệu bằng cách trừu tượng nguồn dữ liệu cơ bản, do đó làm cho ứng dụng nguồn dữ liệu độc lập. Chúng cho phép kiểm soát permisstion, cho phép ứng dụng khác có quyền truy cập đến nguồn lưu trữ dữ liệu hay không, giúp cho việc chia sẻ dữ liệu trở lên dễ dàng. Và tất nhiên, bất kỳ ứng dụng nào có quyền (permissions) phù hợp đều có thể thêm, xóa, cập nhật và truy xuất dữ liệu của một ứng dụng khác bao gồm dữ liệu trong một số cơ sở dữ liệu Android Native.

Có 2 loại Content Providers:

  • Native content providers: Chúng cung cấp quyền truy cập vào cơ sở dữ liệu tích hợp có sẵn, chẳng hạn như Contacts, Media player, Message và các cơ sở dữ liệu gốc khác. Bạn cần cấp các quyền cần thiết cho ứng dụng của mình trước khi sử dụng nhà cung cấp nội dung gốc
  • Custom content providers: 1 dạng custom cở sở dữ liệu tự tạo bởi nhà phát triển để phù hợp với các yêu cầu của ứng dụng.

Content URI

Một thiết bị Android có thể chứa nhiều Content Providers, do đó, hệ thống phải cung cấp giải pháp để phân biệt các Content Providers. URI là một giải pháp cho phép xác định dữ liệu cụ thể với một Content Provider cụ thể.

Một URI có thể chia thành hai phần: phần xác định Content Provider (hay còn gọi là phần Authority) có hình thức giống một gói (package) trong ứng dụng Android, ví dụ: com.example.mydbapp.myprovider; phần thứ hai xác định dữ liệu của Content Provider, ví dụ tham chiếu đến một bảng tên student trong Content Provider: com.example.mydbapp.myprovider/student hay xác định dữ liệu chi tiết hơn, ví dụ tham chiếu đến một hàng có giá trị ID là 3 trong bảng student: com.example.mydbapp.myprovider/student/3.

Có những URI có thể mở rộng đến nhiều cấp và lúc này chúng ta có thể dùng lớp UriMatcher.

Đối tượng ContentResolver

Truy cập đến một Content Provider đạt được nhờ đối tượng ContentResolver. Một ứng dụng có thể đạt được tham chiếu đến đối tượng ContentResolver bằng cách gọi phương thức getContentResolver(). Đối tượng ContentResolver chứa các phương thức tương tự như của một Content Provider như insert(), query(), update(), v.v.

Phần tử

Một Content Provider, để được sử dụng trong hệ thống Android, phải được khai báo trong tập tin manifest với phần tử . Phần tử chứa hai thuộc tính quan trọng là:

android:authority: là URI với phần xác định nội dung của Content Providerandroid:name: chứa tên lớp thực thi Content Provider

Dự án minh họa dùng Content Provider

Tạo dự án

– Tìm đến và sao chép thư mục ứng dụng SQLiteDemoApplication và đổi tên (mặc định là SQLiteDemoApplication-Copy) thành ContentProviderApplication.

– Đóng dự án hiện tại đang mở trên Android Studio bằng cách chọn File > Close Project. Trong cửa sổ Welcome to Android Studio chọn Open an existing Android Studio project:

**

– Trong Open File or Project tìm đến dự án ContentProviderApplication và nhấn OK

**

Thêm gói Content Provider

Thêm gói mới bằng cách vào app > java và nhấn chuột phải vào thư mục java chọn New > Package

**

– Trong hộp thoại Choose Destination Directory chọn …appsourcemainjava và nhấn OK

**

– Trong cửa sổ New Package, nhập tên gói là com.congdonginan.com.database.provider và OK

**

– Lúc này trong cửa sổ Project

**

Tạo các lớp Content Provider

– Sau khi tạo gói com.congdonginan.com.database.provider, chúng ta sẽ thêm các lớp đến gói này bằng cách chọn và nhấn chuột phải vào tên gói (com.congdonginan.com.database.provider) chọn New > Other > Content Provider

**

– Trong hộp thoại Configure Component chọn chấp nhận tên mặc định của lớp là MyContentProvider và nhập com.congdonginan.com.database.provider.MyContentProvider trong URI Authorities:

**

Giữ nguyên các tùy chọn khác và nhấn Finish.

Xem thêm: Cây Phong Lộc Hoa Có Tên Khác Là Gì, Ý Nghĩa Của Cây Phong Lộc Hoa

Lúc này, lớp MyContentProvider.java sẽ xuất hiện trong gói com.congdonginan.com.database.provider

**

Và chúng ta có thể xem nội dung mặc định của tập tin này bằng cách nhấn đôi chuột trái

**

Tạo Authority URI và Content URI

Trong tập tin MyContentProvider.java thêm các đoạn mã sau:

package com.congdonginan.com.database.provider;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.content.UriMatcher;public class MyContentProvider extends ContentProvider { private static final String AUTHORITY =”com.congdonginan.com.database.provider.MyContentProvider”; private static final String STUDENTS_TABLE = “Students”; public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTHORITY + “/” + STUDENTS_TABLE); public MyContentProvider() { }…Chúng ta tạo chuỗi tên AUTHORITY chứa thông tin về Authority URI, chuỗi tên STUDENTS_TABLE chứa thông tin về bảng cơ sở dữ liệu (Students) và chuỗi tên CONTENT_URI là kết hợp của hai chuỗi AUTHORITY và STUDENTS_TABLE bắt đầu bằng chuỗi content:// dùng phương thức parse của lớp Uri.

Đối tượng UriMatcher

URI là một giải pháp cho phép xác định dữ liệu, có thể là một hàng hay một bảng cơ sở dữ liệu, với một Content Provider cụ thể. Chúng ta để ý các phương thức trong lớp MyContentProvider như insert(), delete(), getType(), v.v. đều nhận một URI làm tham số. URI này như một tham chiếu đến một bảng cơ sở dữ liệu hay một hàng cụ thể của bảng đó và trách nhiệm chúng ta là chuyển kiểu Uri phù hợp đến các phương thức. Nhiệm vụ này có thể thực hiện một cách dễ dàng nhờ đối tượng UriMatcher. Khi một thể hiện của UriMatcher được tạo, nó sẽ được cấu hình để trả về một số nguyên tương ứng với kiểu Uri mà nó được yêu cầu. Trong ứng dụng hiện tại, chúng ta sẽ cấu hình thể hiện UriMatcher trả về giá trị 1 nếu tham chiếu đến toàn bộ bảng cơ sở dữ liệu (ví dụ Students) và trả về giá trị 2 nếu tham chiếu đến ID của một hàng nào đó. Thêm hai biến số nguyên tương ứng với hai kiểu Uri vào lớp MyContentProvider như sau:

public class MyContentProvider extends ContentProvider { private static final String AUTHORITY =”com.congdonginan.com.database.provider.MyContentProvider”; private static final String STUDENTS_TABLE = “Students”; public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTHORITY + “/” + STUDENTS_TABLE); public static final int STUDENTS = 1; public static final int STUDENTS_ID = 2; public MyContentProvider() { }…Kế tiếp, tạo thể hiện UriMatcher và cấu hình nó trả về các giá trị số nguyên phù hợp:

public class MyContentProvider extends ContentProvider { private static final String AUTHORITY =”com.congdonginan.com.database.provider.MyContentProvider”; private static final String STUDENTS_TABLE = “Students”; public static final Uri CONTENT_URI = Uri.parse(“content://” + AUTHORITY + “/” + STUDENTS_TABLE); public static final int STUDENTS = 1; public static final int STUDENTS_ID = 2; private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { sURIMatcher.addURI(AUTHORITY, STUDENTS_TABLE, STUDENTS); sURIMatcher.addURI(AUTHORITY, STUDENTS_TABLE + “/#”,STUDENTS_ID); } public MyContentProvider() { }Thực thi phương thức onCreate()Phương thức onCreate() sẽ được gọi khi lớp Content Provider được tạo. Mục đích gọi onCreate() trong ứng dụng minh họa này là tạo một thể hiện của lớp DataHandler (một bản sao của lớp DataHandler từ ứng dụng trong Phần 1). Để tạo thể hiện DataHandler và sử dụng các phương thức trong lớp này, chúng ta cần khai báo lớp DataHandler trong tập tin MyContentProvider.java và vì lớp DataHandler được chứa trong gói com.congdonginan.com.sqlitedemoapplication

**

nên chúng ta khai báo như sau:

package com.congdonginan.com.database.provider;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.content.UriMatcher;import com.congdonginan.com.sqlitedemoapplication.DataHandler;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteQueryBuilder;import android.text.TextUtils;public class MyContentProvider extends ContentProvider { …}Khởi tạo thể hiện lớp DataHandler trong phương thức onCreate() như sau:

public class MyContentProvider extends ContentProvider { … private DataHandler myHandler; public MyContentProvider() { }

Lợi ích Content Providers

Content Providers rất hữu ích cho các ứng dụng muốn cung cấp dữ liệu cho các ứng dụng khác.

  • Với Content Providers, bạn có thể cho phép nhiều ứng dụng khác truy cập, sử dụng và sửa đổi một nguồn dữ liệu duy nhất mà ứng dụng của bạn cung cấp. (Ví dụ ở trên)
  • Để kiểm soát truy cập, bạn có thể chỉ định các permisions cho Content Providers của mình, chỉ định cách các ứng dụng khác có thể truy cập dữ liệu. Ví dụ: Nhà hàng có thể không được phép thay đổi dữ liệu thông tin món ăn mà không phải do họ cung cấp.
  • Bạn có thể lưu trữ dữ liệu độc lập với ứng dụng, bởi vì Content Providers nằm giữa giao diện người dùng và nơi dữ liệu của bạn được lưu trữ. Bạn có thể thay đổi cách dữ liệu được lưu trữ mà không cần thay code chương trình.
  • Một lợi ích khác của việc tách dữ liệu khỏi giao diện người dùng với Content Providers là các nhóm phát triển có thể hoạt động độc lập trên giao diện người dùng và kho dữ liệu của ứng dụng của bạn. Đối với các ứng dụng phức tạp, lớn hơn, rất phổ biến là giao diện người dùng và phần phụ trợ dữ liệu được phát triển bởi các nhóm khác nhau và thậm chí chúng có thể là các ứng dụng riêng biệt.

Xem thêm bài viết thuộc chuyên mục: Là gì