Tutorial Android Content Provider (Content Provider) Terbaik Pada tahun 2024, Dalam tutorial ini Anda dapat mempelajari konten URI,Buat penyedia konten,contoh,
Konten provider dengan meminta komponen memberikan data dari satu aplikasi ke aplikasi lain. Permintaan ini dengan cara kelas ContentResolver untuk menangani. penyedia konten dapat menggunakan berbagai cara untuk menyimpan data. Data dapat disimpan dalam database, file, atau bahkan jaringan.
Kadang-kadang perlu untuk berbagi data antara aplikasi. Dalam hal ini penyedia konten menjadi sangat berguna.
penyedia konten dapat membuat fokus konten, Anda dapat memiliki sejumlah aplikasi yang berbeda untuk mengakses, jika perlu. penyedia konten dan bertindak seperti database. Anda dapat query, mengedit isinya, menggunakan insert (), update (), menghapus () dan permintaan () untuk menambahkan atau menghapus konten. Dalam kebanyakan kasus data disimpan dalam database SQLite.
Penyedia konten diimplementasikan sebagai subclass dari kelas kelas ContentProvider. Kita perlu menerapkan serangkaian API standar, sehingga aplikasi lain untuk melaksanakan transaksi.
public class MyApplication extends ContentProvider { }
Untuk query penyedia konten, Anda harus dalam bentuk format berikut untuk menentukan URI string kueri:
<prefix>://<authority>/<data_type>/<id>
Berikut ini adalah deskripsi khusus dari setiap bagian dari URI:
bagian | penjelasan |
---|---|
awalan | Awalan: telah ditetapkan sebagai konten: // |
kewenangan | Otorisasi: Menentukan nama penyedia konten, misalnya kontak, browser, dll penyedia konten pihak ketiga mungkin nama lengkap, seperti: cn.programmer.statusprovider |
data_type | Data Type: ini menunjukkan bahwa jenis tertentu dari penyedia isi data. Sebagai contoh: Anda ingin memberikan oleh penyedia konten untuk mendapatkan semua buku alamat Kontak, jalur data adalah orang, maka URI akan terlihat sebagai berikut: konten: // kontak / orang |
id | Permintaan ini ditentukan catatan tertentu. Sebagai contoh: Anda menyediakan Kontak penyedia konten Cari nomor kontak ID adalah 5, maka URI terlihat seperti ini: konten: // kontak / orang / 5 |
langkah-langkah sederhana yang dijelaskan di sini penyedia untuk membuat konten mereka sendiri.
Berikut ini adalah penyedia konten untuk mendapatkan pekerjaan Anda, Anda perlu beberapa metode dalam ditulis ulang kelas ContentProvider:
Contoh ini menjelaskan cara membuat penyedia konten Anda sendiri. Mari kita ikuti langkah-langkah di bawah ini:
langkah | deskripsi |
---|---|
1 | Membuat aplikasi Android menggunakan Android Studio bernama Content Provider, di cn.uprogrammer.contentprovider paket, dan pembentukan ruang kegiatan. |
2 | Memodifikasi kegiatan utama MainActivity.java mengajukan untuk menambah dua metode baru onClickAddName () dan onClickRetrieveStudents (). |
3 | Dibuat di bawah paket Java baru cn.uprogrammer.contentprovider berkas StudentsProvider.java untuk menentukan penyedia sebenarnya, dan metode terkait. |
4 | Gunakan <penyedia id. /> tag di AndroidManifest.xml terdaftar penyedia konten. |
5 | Memodifikasi res konten default / tata letak / berkas activity_main.xml untuk menambahkan catatan siswa berisi antarmuka yang sederhana. |
6 | Tanpa memodifikasi strings.xml, Android Studio akan memperhatikan berkas strings.xml. |
7 | Luncurkan emulator Android untuk menjalankan aplikasi dan memverifikasi hasil perubahan yang dibuat untuk aplikasi. |
Berikut adalah isi dari modifikasi file utama kegiatan src / cn.uprogrammer.contentprovider / MainActivity.java dari. File ini berisi masing-masing pendekatan siklus hidup dasar. Kami telah menambahkan dua metode baru, onClickAddName () dan onClickRetrieveStudents () untuk membiarkan interaksi pengguna aplikasi pegangan.
package cn.uprogrammer.contentprovider; 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; import cn.uprogrammer.contentprovider.R; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } 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.provider.College/students"; 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 dalam paket StudentsProvider.java cn.uprogrammer.contentprovider. Berikut ini adalah isi dari src / cn.uprogrammer.contentprovider / StudentsProvider.java dari.
package cn.uprogrammer.contentprovider; 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.provider.College"; 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); } /** * 数据库特定常量声明 */ 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);"; /** * 创建和管理提供者内部数据源的帮助类. */ 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); /** * 如果不存在,则创建一个可写的数据库。 */ db = dbHelper.getWritableDatabase(); return (db == null)? false:true; } @Override public Uri insert(Uri uri, ContentValues values) { /** * 添加新学生记录 */ long rowID = db.insert( STUDENTS_TABLE_NAME, "", values); /** * 如果记录添加成功 */ 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: throw new IllegalArgumentException("Unknown URI " + uri); } if (sortOrder == null || sortOrder == ""){ /** * 默认按照学生姓名排序 */ sortOrder = NAME; } Cursor c = qb.query(db, projection, selection, selectionArgs,null, null, sortOrder); /** * 注册内容URI变化的监听器 */ 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)){ /** * 获取所有学生记录 */ case STUDENTS: return "vnd.android.cursor.dir/vnd.example.students"; /** * 获取一个特定的学生 */ case STUDENT_ID: return "vnd.android.cursor.item/vnd.example.students"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } }
Berikut ini adalah modifikasi file AndroidManifest.xml. Berikut Ditambahkan <penyedia id. /> tag untuk menyertakan penyedia konten kami:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.uprogrammer.contentprovider" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="cn.uprogrammer.contentprovider.MainActivity" android:label="@string/app_name" > <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.provider.College" > </provider> </application> </manifest>
Berikut adalah isi dari res / layout / berkas activity_main.xml:
<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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="内容提供者实例" 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="www.uprogrammer.cn" 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/ic_launcher" 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="添加" 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="姓名" 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="年级" android:textColorHint="@android:color/holo_blue_bright" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="查询" 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 res / values / berkas strings.xml memiliki isi berikut:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Content Provider</string> <string name="action_settings">Settings</string> </resources>
Mari kita jalankan aplikasi Content Provider dimodifikasi. Saya berasumsi bahwa Anda telah membuat AVD selama lingkungan instalasi. Buka proyek Anda dalam file yang aktif, klik pada toolbar Icon untuk menjalankan aplikasi Dalam Android Studio. Android Studio menginstal aplikasi pada AVD dan mulai itu. Jika semua berjalan dengan baik, itu akan ditampilkan pada jendela emulator sebagai berikut:
Masukkan nama dan tahun, dan klik pada tombol "Add", yang akan menambah catatan mahasiswa dalam data, dan di bagian bawah untuk menghapus pesan. konten informasi menampilkan sejumlah catatan ditambahkan ke penyedia isi database URI. Operasi ini menggunakan metode insert (). Ulangi proses ini untuk menambahkan lebih banyak siswa dalam database penyedia konten kami.
Setelah Anda menyelesaikan catatan database ditambahkan, sekarang saatnya untuk memberikan kembali ke penyedia konten memerlukan catatan ini. Klik tombol "Cari", yang akan datang untuk mengambil dan menampilkan semua data yang tercatat dengan menerapkan metode query ().
Anda dapat memberikan metode callback MainActivity.java untuk mempersiapkan update dan menghapus operasi, dan memodifikasi antarmuka pengguna untuk menambahkan update dan menghapus operasi.
Anda dapat menggunakan konten yang ada disediakan dengan cara ini oleh kontak tersebut. Anda dapat juga dengan cara ini untuk mengembangkan aplikasi database berorientasi baik, Anda dapat dilakukan seperti yang dijelaskan di atas dikenal sebagai sebuah contoh dari operasi database, seperti membaca, menulis, memperbarui dan menghapus.