- Bài 1: Tổng quan về hệ điều hành Android
- Bài 2: Lập trình Android với Android studio
- Bài 3: Các thành phần cơ bản trong một ứng dụng Android
- Bài 4: Activity
- Bài 5: Fragment
- Bài 6: Các thành phần giao diện cơ bản trong Android
- Bài 7: Layout trong Android : Phần 1
- Bài 8: Layout trong Android : Phần 2
- Bài 9: Style và Theme trong Android
- Bài 10: Listview trong Android
- Bài 11: RecyclerView trong Android
- Bài 12: Menu trong Android
- Bài 13: Sử dụng Dialog trong Android
- Bài 14: AndroidManifest.xml Trong Android
- Bài 15: Các tài nguyên và ứng dụng cơ bản trong Android
- Bài 16: Intent trong Android
- Bài 17: Lưu trữ dữ liệu trong Android
- Bài 18: Service trong Android
- Bài 19: Content provider trong Android
- Bài 20: Broadcast Receivers trong Android
- Bài 21: SQLite trong Android
- Bài 22: Android notification
- Bài 23: Animation trong Android
- Bài 24: Android Drawables
- Bài 25: Room trong Android
- Bài 26: CursorLoader trong Android
- Bài 27: Databinding trong Android
- Bài 28: Toolbar, ActionBar trong lập trình Android
- Bài 29: AsyncTask – thread & handler trong Android
- Bài 30: Các thư viện thường dùng trong Android
- Bài 31: Tìm hiểu về MVC, MVP và MVVM
- Bài 32: AlarmManager trong Android
- Bài 33: Permission trong Android
- Bài 34: Đóng gói ứng dụng Android
Bài 19: Content provider trong Android - Lập trình Android cơ bản
Đăng bởi: Admin | Lượt xem: 3357 | Chuyên mục: Android
1. Giới thiệu tổng quan
Trên nền tảng Android, một ứng dụng không thể truy cập trực tiếp (đọc / ghi) dữ liệu của ứng dụng khác. Tất cả dữ liệu của ứng dụng là riêng tư đối với ứng dụng đó. Mỗi ứng dụng đều có thư mục dữ liệu id riêng và vùng bộ nhớ được bảo vệ riêng. Điều này có nghĩa là một ứng dụng không thể truy vấn hoặc thao tác dữ liệu của một ứng dụng khác. Tuy nhiên, nếu bạn muốn bật ứng dụng truy vấn hoặc thao tác dữ liệu của ứng dụng khác, bạn cần sử dụng khái niệm Content Providers. Vậy chúng ta cùng tìm hiểu nó như thế nào nhé !
1.1 Khái niệm :
Content provider là một thành phần để quản lý truy cập dữ liệu, nó cung cấp các phương thức khác nhau để các ứng dụng có thể truy cập dữ liệu từ một ứng dụng khác bằng cách sử dụng ContentResolver. Content Provider có thể giúp cho một ứng dụng quản lý quyền truy cập đến dữ liệu được lưu bởi ứng dụng đó, hoặc các ứng dụng khác, và đó là một cách để ta có thể chia sẻ dữ liệu cho các ứng dụng khác nhau. Hình dưới đây biểu diễn cho việc cách content providers quản lý việc truy cập tới bộ nhớ
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 và các component như hình dưới, nó bao gồm
- Chia sẻ dữ liệu từ ứng dụng của bán tới các ứng dụng khác
- Gửi dữ liệu sang widget
- Trả về một kết quả gợi ý khi search cho ứng dụng của bạn thông qua Seach Framework sử dụng SearchRecentSuggestionsProvider
- Đồng bộ dữ liệu của ứng dụng với server bằng cách sử 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 cơ sở dữ liệu, bạn có thể truy vấn, chỉnh sửa nội dung, cũng như là thêm xóa các nội dung sử dụng các phương thức: insert(), update(), delete(), query().
2. Sử dụng Content Provider
Để sử dụng Content Provider ta làm theo các bước sau:
- Xác định kiểu dữ liệu
- Xác định Uniform Resource Identifier (URI)
- Khai báo Content Provider trong manifest
- Implement lớp ContentProvider và các phương thức được yêu cầu.
Các phương thức cần được Override trong lớp Content Provider:
- onCreate(): Phương thức này được gọi khi Provider được bắt đầu, nếu quá trình khởi tạo thành công trả về true, ngược lại là false
- query(): Phươ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(): Phương thức chèn một dòng dữ liệu mới vào Content Provider.
- delete(): Phương thức xóa một dòng dữ liệu đã tồn tại.
- update(): Phương thức cập nhật một dòng dữ liệu nào đó đã tồn tại.
- getType(): Phươ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 bộ provider và một tên chỉ tới một bảng. Khi bạn gọi một phương thức truy cập tới bảng trong provider thì Content URI của bảng đó 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://authority/path/id
- content: luôn là content://
- authority: một xâu để xác định tên của Content Provider, ví dụ như contact, browser,...
- path: có thể không có hoặc được chia làm nhiều phần, và đượ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. Ví dụ như để lấy danh sách 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ố ví dụ về URI:
- Content://media/internal/images – trả về List tất cả các ảnh lưu trong thiết bị
- Content://contact/people – Trả về list tất cả 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ẽ hướng dẫn các bạn tự tạo một Content URI và sử dụng nó cùng với Content Provider để truy xuất dữ liệu từ CSDL nhé:
3. Tạo Database class
Đầu tiên, bạn cần tạo một SQLite Database, đầu tiên ta khởi tạo các giá trị cài đặt của DB như phiên bản database, database name, sau đó update ở 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);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
3.1 Định dạng Database Schema
Giả sử dữ liệu của chúng ta có các trường: title và url và id, đoạn code sau sẽ khai báo tạo một bảng với các thông số 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 ra một bảng theo như những gì ta đã định dạng ở bước trước
@Override
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 và tạo một instance của TutListDatabase ở bên trong hàm onCreate():
public class TutListProvider extends ContentProvider {
private TutListDatabase mDB;
@Override
public boolean onCreate() {
mDB = new TutListDatabase(getContext());
return true;
}
3.4 Định nghĩa URI và các constant
Ví dụ, ta sẽ tạo ra một URI với tên và định dạng như sau
content:// com.mamlambo.tutorial.tutlist.data.TutListProvider/tutorials
Để sử dụng URI này, ta sẽ cần định nghĩa một vài constant để xác định 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 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 chính xác URI pattern nào được Content provider hỗ trợ, 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. Xử lý 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 tương tự như activity
<provider
android:authorities="com.mamlambo.tutorial.tutlist.data.TutListProvider"
android:multiprocess="true"
android:name="com.mamlambo.tutorial.tutlist.data.TutListProvider"></provider>
6. Tổng kết
Cảm ơn các bạn đã đọc bài viết của chúng tôi, hi vọng những kiến thức trong bài viết có thể giúp ích được ít nhiều trong việc làm và quá trình học tập của các bạn.
Tài liệu tham khảo:
Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!
- Bài 1: Tổng quan về hệ điều hành Android
- Bài 2: Lập trình Android với Android studio
- Bài 3: Các thành phần cơ bản trong một ứng dụng Android
- Bài 4: Activity
- Bài 5: Fragment
- Bài 6: Các thành phần giao diện cơ bản trong Android
- Bài 7: Layout trong Android : Phần 1
- Bài 8: Layout trong Android : Phần 2
- Bài 9: Style và Theme trong Android
- Bài 10: Listview trong Android
- Bài 11: RecyclerView trong Android
- Bài 12: Menu trong Android
- Bài 13: Sử dụng Dialog trong Android
- Bài 14: AndroidManifest.xml Trong Android
- Bài 15: Các tài nguyên và ứng dụng cơ bản trong Android
- Bài 16: Intent trong Android
- Bài 17: Lưu trữ dữ liệu trong Android
- Bài 18: Service trong Android
- Bài 19: Content provider trong Android
- Bài 20: Broadcast Receivers trong Android
- Bài 21: SQLite trong Android
- Bài 22: Android notification
- Bài 23: Animation trong Android
- Bài 24: Android Drawables
- Bài 25: Room trong Android
- Bài 26: CursorLoader trong Android
- Bài 27: Databinding trong Android
- Bài 28: Toolbar, ActionBar trong lập trình Android
- Bài 29: AsyncTask – thread & handler trong Android
- Bài 30: Các thư viện thường dùng trong Android
- Bài 31: Tìm hiểu về MVC, MVP và MVVM
- Bài 32: AlarmManager trong Android
- Bài 33: Permission trong Android
- Bài 34: Đóng gói ứng dụng Android