Android - Penyedia Konten
Komponen penyedia konten memasok data dari satu aplikasi ke aplikasi lainnya berdasarkan permintaan. Permintaan tersebut ditangani dengan metode kelas ContentResolver. Penyedia materi dapat menggunakan berbagai cara untuk menyimpan datanya dan data tersebut dapat disimpan dalam database, dalam file, atau bahkan melalui jaringan.
Penyedia konten
sometimes it is required to share data across applications. This is where content providers become very useful.
Penyedia konten memungkinkan Anda memusatkan konten di satu tempat dan memiliki banyak aplikasi berbeda yang mengaksesnya sesuai kebutuhan. Penyedia materi berperilaku sangat mirip dengan database tempat Anda bisa mengkueri, mengedit kontennya, serta menambah atau menghapus konten menggunakan metode insert (), update (), delete (), dan query (). Dalam kebanyakan kasus, data ini disimpan di fileSQlite database.
Penyedia materi diimplementasikan sebagai subclass dari ContentProvider kelas dan harus menerapkan seperangkat API standar yang memungkinkan aplikasi lain untuk melakukan transaksi.
public class My Application extends ContentProvider {
}
URI Konten
Untuk membuat kueri penyedia konten, Anda menentukan string kueri dalam bentuk URI yang memiliki format berikut -
<prefix>://<authority>/<data_type>/<id>
Berikut adalah detail berbagai bagian URI -
Sr Tidak | Bagian & Deskripsi |
---|---|
1 | prefix Ini selalu disetel ke konten: // |
2 | authority Ini menentukan nama penyedia konten, misalnya kontak , browser , dll. Untuk penyedia konten pihak ketiga, ini bisa menjadi nama yang sepenuhnya memenuhi syarat, seperti com.tutorialspoint.statusprovider |
3 | data_type Ini menunjukkan jenis data yang disediakan penyedia khusus ini. Misalnya, jika Anda mendapatkan semua kontak dari penyedia konten Kontak , maka jalur datanya adalah orang dan URI akan terlihat seperti konten ini : // contacts / people |
4 | id Ini menentukan catatan khusus yang diminta. Misalnya, jika Anda mencari nomor kontak 5 di penyedia konten Kontak, maka URI akan terlihat seperti konten ini : // contacts / people / 5 . |
Buat Penyedia Konten
Ini melibatkan sejumlah langkah sederhana untuk membuat penyedia konten Anda sendiri.
Pertama-tama, Anda perlu membuat kelas Penyedia Konten yang memperluas kelas ContentProviderbaseclass.
Kedua, Anda perlu menentukan alamat URI penyedia konten yang akan digunakan untuk mengakses konten.
Selanjutnya Anda perlu membuat database Anda sendiri untuk menyimpan konten. Biasanya, Android menggunakan database SQLite dan framework perlu mengganti metode onCreate () yang akan menggunakan metode SQLite Open Helper untuk membuat atau membuka database penyedia. Saat aplikasi Anda diluncurkan, onCreate () handler dari setiap Penyedia Kontennya dipanggil pada thread aplikasi utama.
Selanjutnya Anda harus mengimplementasikan kueri Penyedia Konten untuk melakukan operasi khusus database yang berbeda.
Terakhir, daftarkan Penyedia Konten Anda di file aktivitas menggunakan tag <provider>.
Berikut adalah daftar metode yang perlu Anda ganti di kelas Penyedia Konten agar Penyedia Konten Anda berfungsi -
Penyedia konten
onCreate() Metode ini dipanggil saat penyedia dimulai.
query()Metode ini menerima permintaan dari klien. Hasilnya dikembalikan sebagai objek Cursor.
insert()Metode ini memasukkan record baru ke dalam penyedia konten.
delete() Metode ini menghapus rekaman yang ada dari penyedia konten.
update() Metode ini memperbarui catatan yang ada dari penyedia konten.
getType() Metode ini mengembalikan tipe MIME dari data pada URI yang diberikan.
Contoh
Contoh ini akan menjelaskan cara membuat PenyediaKonten Anda sendiri . Jadi mari kita ikuti langkah-langkah berikut untuk serupa dengan apa yang kita ikuti saat membuat Contoh Hello World -
Langkah | Deskripsi |
---|---|
1 | Anda akan menggunakan Android StudioIDE untuk membuat aplikasi Android dan menamainya sebagai Aplikasi Saya di bawah paket com.example.MyApplication , dengan Aktivitas kosong. |
2 | Ubah file aktivitas utama MainActivity.java untuk menambahkan dua metode baru onClickAddName () dan onClickRetrieveStudents () . |
3 | Buat file java baru bernama StudentsProvider.java di bawah paket com.example.MyApplication untuk menentukan penyedia Anda yang sebenarnya dan metode terkait. |
4 | Daftarkan penyedia konten Anda dalam file AndroidManifest.xml menggunakan tag <provider ... /> |
5 | Ubah konten default file res / layout / activity_main.xml untuk menyertakan GUI kecil untuk menambahkan catatan siswa. |
6 | Tidak perlu mengubah string.xml.Android studio mengurus file string.xml. |
7 | Jalankan aplikasi untuk meluncurkan emulator Android dan verifikasi hasil perubahan yang dilakukan dalam aplikasi. |
Berikut adalah konten file aktivitas utama yang dimodifikasi src/com.example.MyApplication/MainActivity.java. File ini dapat menyertakan setiap metode siklus hidup dasar. Kami telah menambahkan dua metode baru onClickAddName () dan onClickRetrieveStudents () untuk menangani interaksi pengguna dengan aplikasi.
package com.example.MyApplication;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickAddName(View view) {
// Add a new student record
ContentValues values = new ContentValues();
values.put(StudentsProvider.NAME,
((EditText)findViewById(R.id.editText2)).getText().toString());
values.put(StudentsProvider.GRADE,
((EditText)findViewById(R.id.editText3)).getText().toString());
Uri uri = getContentResolver().insert(
StudentsProvider.CONTENT_URI, values);
Toast.makeText(getBaseContext(),
uri.toString(), Toast.LENGTH_LONG).show();
}
public void onClickRetrieveStudents(View view) {
// Retrieve student records
String URL = "content://com.example.MyApplication.StudentsProvider";
Uri students = Uri.parse(URL);
Cursor c = managedQuery(students, null, null, null, "name");
if (c.moveToFirst()) {
do{
Toast.makeText(this,
c.getString(c.getColumnIndex(StudentsProvider._ID)) +
", " + c.getString(c.getColumnIndex( StudentsProvider.NAME)) +
", " + c.getString(c.getColumnIndex( StudentsProvider.GRADE)),
Toast.LENGTH_SHORT).show();
} while (c.moveToNext());
}
}
}
Buat file baru StudentsProvider.java di bawah paket com.example.MyApplication dan berikut adalah kontennyasrc/com.example.MyApplication/StudentsProvider.java -
package com.example.MyApplication;
import java.util.HashMap;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
public class StudentsProvider extends ContentProvider {
static final String PROVIDER_NAME = "com.example.MyApplication.StudentsProvider";
static final String URL = "content://" + PROVIDER_NAME + "/students";
static final Uri CONTENT_URI = Uri.parse(URL);
static final String _ID = "_id";
static final String NAME = "name";
static final String GRADE = "grade";
private static HashMap<String, String> STUDENTS_PROJECTION_MAP;
static final int STUDENTS = 1;
static final int STUDENT_ID = 2;
static final UriMatcher uriMatcher;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "students", STUDENTS);
uriMatcher.addURI(PROVIDER_NAME, "students/#", STUDENT_ID);
}
/**
* Database specific constant declarations
*/
private SQLiteDatabase db;
static final String DATABASE_NAME = "College";
static final String STUDENTS_TABLE_NAME = "students";
static final int DATABASE_VERSION = 1;
static final String CREATE_DB_TABLE =
" CREATE TABLE " + STUDENTS_TABLE_NAME +
" (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" name TEXT NOT NULL, " +
" grade TEXT NOT NULL);";
/**
* Helper class that actually creates and manages
* the provider's underlying data repository.
*/
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_DB_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME);
onCreate(db);
}
}
@Override
public boolean onCreate() {
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
/**
* Create a write able database which will trigger its
* creation if it doesn't already exist.
*/
db = dbHelper.getWritableDatabase();
return (db == null)? false:true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
/**
* Add a new student record
*/
long rowID = db.insert( STUDENTS_TABLE_NAME, "", values);
/**
* If record is added successfully
*/
if (rowID > 0) {
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
getContext().getContentResolver().notifyChange(_uri, null);
return _uri;
}
throw new SQLException("Failed to add a record into " + uri);
}
@Override
public Cursor query(Uri uri, String[] projection,
String selection,String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(STUDENTS_TABLE_NAME);
switch (uriMatcher.match(uri)) {
case STUDENTS:
qb.setProjectionMap(STUDENTS_PROJECTION_MAP);
break;
case STUDENT_ID:
qb.appendWhere( _ID + "=" + uri.getPathSegments().get(1));
break;
default:
}
if (sortOrder == null || sortOrder == ""){
/**
* By default sort on student names
*/
sortOrder = NAME;
}
Cursor c = qb.query(db, projection, selection,
selectionArgs,null, null, sortOrder);
/**
* register to watch a content URI for changes
*/
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)){
case STUDENTS:
count = db.delete(STUDENTS_TABLE_NAME, selection, selectionArgs);
break;
case STUDENT_ID:
String id = uri.getPathSegments().get(1);
count = db.delete( STUDENTS_TABLE_NAME, _ID + " = " + id +
(!TextUtils.isEmpty(selection) ? "
AND (" + selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values,
String selection, String[] selectionArgs) {
int count = 0;
switch (uriMatcher.match(uri)) {
case STUDENTS:
count = db.update(STUDENTS_TABLE_NAME, values, selection, selectionArgs);
break;
case STUDENT_ID:
count = db.update(STUDENTS_TABLE_NAME, values,
_ID + " = " + uri.getPathSegments().get(1) +
(!TextUtils.isEmpty(selection) ? "
AND (" +selection + ')' : ""), selectionArgs);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri );
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
/**
* Get all student records
*/
case STUDENTS:
return "vnd.android.cursor.dir/vnd.example.students";
/**
* Get a particular student
*/
case STUDENT_ID:
return "vnd.android.cursor.item/vnd.example.students";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
}
Berikut adalah konten yang dimodifikasi dari file AndroidManifest.xml . Di sini kami telah menambahkan tag <provider ... /> untuk menyertakan penyedia konten kami:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.MyApplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name="StudentsProvider"
android:authorities="com.example.MyApplication.StudentsProvider"/>
</application>
</manifest>
Berikut akan menjadi konten res/layout/activity_main.xml berkas−
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.MyApplication.MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Content provider"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutorials point "
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_below="@+id/textView1"
android:layout_centerHorizontal="true" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/abc"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="Add Name"
android:layout_below="@+id/editText3"
android:layout_alignRight="@+id/textView2"
android:layout_alignEnd="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_alignStart="@+id/textView2"
android:onClick="onClickAddName"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:layout_below="@+id/imageButton"
android:layout_alignRight="@+id/imageButton"
android:layout_alignEnd="@+id/imageButton" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_alignTop="@+id/editText"
android:layout_alignLeft="@+id/textView1"
android:layout_alignStart="@+id/textView1"
android:layout_alignRight="@+id/textView1"
android:layout_alignEnd="@+id/textView1"
android:hint="Name"
android:textColorHint="@android:color/holo_blue_light" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText3"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText2"
android:layout_alignStart="@+id/editText2"
android:layout_alignRight="@+id/editText2"
android:layout_alignEnd="@+id/editText2"
android:hint="Grade"
android:textColorHint="@android:color/holo_blue_bright" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Retrive student"
android:id="@+id/button"
android:layout_below="@+id/button2"
android:layout_alignRight="@+id/editText3"
android:layout_alignEnd="@+id/editText3"
android:layout_alignLeft="@+id/button2"
android:layout_alignStart="@+id/button2"
android:onClick="onClickRetrieveStudents"/>
</RelativeLayout>
Pastikan Anda memiliki konten berikut dari res/values/strings.xml mengajukan:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My Application</string>
</resources>;
Ayo coba jalankan modifikasi kita My Applicationaplikasi yang baru saja kita buat. Saya berasumsi bahwa Anda telah membuat fileAVDsaat melakukan pengaturan lingkungan. Untuk menjalankan aplikasi dari Android Studio IDE, buka salah satu file aktivitas proyek Anda dan klik
Sekarang mari masuk siswa Name dan Grade dan terakhir klik Add Nametombol, ini akan menambahkan catatan siswa dalam database dan akan mem-flash pesan di bagian bawah yang menampilkan URI Penyedia Konten bersama dengan nomor catatan yang ditambahkan dalam database. Operasi ini memanfaatkan kamiinsert()metode. Mari ulangi proses ini untuk menambahkan beberapa siswa lagi di database penyedia konten kita.
Setelah Anda selesai menambahkan catatan dalam database, sekarang saatnya meminta ContentProvider untuk mengembalikan catatan tersebut kepada kita, jadi mari klik Retrieve Students tombol yang akan mengambil dan menampilkan semua catatan satu per satu yang sesuai dengan implementasi kami query() metode.
Anda bisa menulis aktivitas terhadap operasi update dan delete dengan menyediakan fungsi callback di MainActivity.java file dan kemudian ubah antarmuka pengguna agar memiliki tombol untuk memperbarui dan menghapus operasi dengan cara yang sama seperti yang kita lakukan untuk operasi tambah dan baca.
Dengan cara ini Anda dapat menggunakan Penyedia Konten yang sudah ada seperti Buku Alamat atau Anda dapat menggunakan konsep Penyedia Konten dalam mengembangkan aplikasi berorientasi database yang bagus di mana Anda dapat melakukan semua jenis operasi database seperti membaca, menulis, memperbarui, dan menghapus seperti yang dijelaskan di atas dalam contoh.