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. 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é:
Đầ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) {
}
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;
Để tạo Database, 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);
}
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;
}
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);
}
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);
}
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>
Unpublished comment
Viết câu trả lời