Kajian awal tentang ContentProvider
Pengenalan kepada bahagian ini:
Apa yang dibawa oleh bahagian ini kepada anda ialah yang terakhir daripada empat komponen utama Android - ContentProvider (pembekal kandungan), yang mungkin untuk sesetengah pembaca Saya mempunyai soalan, "Adakah Android tidak mempunyai lima komponen utama? Dan bagaimana pula dengan Niat Ya, Niat juga sangat penting, tetapi ia?" Hanya kekalkan hubungan antara komponen ini! Kami akan menerangkan Niat dalam bab seterusnya! Bercakap tentang ContentProvider ini, bila lagi Adakah dia akan digunakan? Terdapat dua jenis berikut:
- 1.Kami mahu mengakses aplikasi lain dalam aplikasi kami sendiri, atau beberapa data yang didedahkan kepada kami oleh beberapa ContentProvider, Seperti kenalan telefon bimbit, mesej teks, dsb.! Kami mahu membaca atau mengubah suai data ini, jadi kami perlu menggunakan ContentProvider!
- 2.Aplikasi kami sendiri mahu mendedahkan beberapa datanya untuk dibaca atau dikendalikan oleh aplikasi lain Kepada ContentProvider, kami juga boleh memilih data untuk didedahkan, sekali gus mengelakkan kebocoran data peribadi kami!
Nampaknya seperti menipu, tetapi ia sebenarnya sangat mudah untuk digunakan Mari belajar tentang ContentProvider~Dokumen Rasmi: ContentProviderDalam bahagian ini kita akan. Terangkan konsep ContentProvder dan tulis beberapa contoh yang biasa digunakan untuk menggunakan ContentProvider sistem. Dan Penyedia Kandungan tersuai!
Penjelasan konsep ContentProvider:
2. Gunakan ContentProvider yang disediakan oleh sistem
Malah, banyak kali apabila kami menggunakan ContentProvider, kami tidak mendedahkan data kami sendiri Lebih kerap, kami menggunakan ContentResolver untuk membaca maklumat aplikasi lain yang paling biasa digunakan adalah untuk membaca sistem maklumat APP. Maklumat multimedia dan banyak lagi! Jika anda ingin menghubungi ContentProviders ini, anda perlu menyemak sendiri maklumat API yang berkaitan! Di samping itu, versi yang berbeza mungkin sepadan dengan URL yang berbeza! Berikut ialah cara untuk mendapatkan URL dan medan jadual pangkalan data yang sepadan, Di sini kami mengambil kenalan yang paling biasa digunakan sebagai contoh Untuk orang lain, google~
①Pergi ke fail kod sumber sistem: all-src.rar -> AndroidManifest.xml untuk mencari API yang sepadan
②Buka fail emulator explorer/data/data/com.android.providers.contacts/databases/contact2.db Selepas mengeksport, gunakan alat grafik SQLite untuk melihat tiga jadual teras: raw_contact table , data table , mimetypes table !
Yang berikut menunjukkan beberapa contoh operasi asas:
1) Bacaan ringkas maklumat peti masuk:
Kod teras:
Uri uri = Uri.parse("content://sms/");
ContentResolver resolver = getContentResolver();
毀可哪些列的信息
Kursor kursor = resolver.query(uri, new String[]{"address","date","type","body"}, null, null, null);
while cursor.moveToNext())
{
Alamat rentetan = cursor.getString(0);
Tarikh rentetan = cursor.getString(1);
🎜> String body = cursor.getString(3);
System.out.println("地址:" + alamat);
System.out.println(" tarikh Sistem.out.+ 间); tarikh keluar ystem .out.println("类型:" + type);
System.out.println("内容:" + body);
System.out.println("========== ============");
}
cursor.close();
}
Keputusan berjalan:
Sebahagian daripada keputusan larian adalah seperti berikut:
2) Hanya tambahkannya ke peti masuk anda Sisipkan mesej
Kod teras:
ContentResolver resolver = getContentResolver();
Uri uri = Uri .parse("content://sms/");
ContentValues conValues = new ContentValues();
conValues.put("address", "123456789");
conValues.put("type" , 1);
conValues.put("date", System.currentTimeMillis());
conValues.put("body", "no zuo no die why you try!" );
penyelesai(uri, conValues);
Log.e("HeHe", "Sisipan SMS selesai~");
}
Hasil jalankan:
Nota:
Kod di atas Fungsi menulis mesej teks boleh dilaksanakan di bawah 4.4, tetapi ia tidak boleh ditulis pada 5.0 Sebabnya ialah: Bermula dari 5.0, perisian selain aplikasi SMS lalai tidak boleh menghantar mesej teks dengan menulis ke pangkalan data SMS!
3) Bacaan mudah kenalan telefon mudah alih
Kod teras:
//①Soal jadual raw_contacts untuk mendapatkan id kenalan
ContentResolver resolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
//Query contact data
cur sor = solver .query(uri, null, null, null, null);
while(cursor.moveToNext())
{
//Dapatkan nama kenalan, nombor telefon bimbit
String cName = cursor. getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out .print Nama:" + cName);
System.out.println("Nombor:" + cNum);
System.out.println("================ ======");
}
cursor.close();
}
Jangan lupa tambah kebenaran untuk membaca kenalan:
Keputusan berjalan:
Sebahagian daripada keputusan berjalan adalah seperti berikut:
4) Tanya kenalan maklumat nombor telefon yang dinyatakan
Kod teras:
Uri uri = Uri.parse("content ://com.android .contacts/data/phones/filter/" + nombor);
ContentResolver resolver = getContentResolver();
Kursor kursor = resolver.query(uri, new String[]{"display_name" }, null, null, null);
if (cursor.moveToFirst()) {
String name = cursor.getString(0);
System.out.println(nombor + "Nama kenalan yang sepadan: " + nama) ;
}
cursor.close();
}
Hasil jalankan:
5) Tambah kenalan baharu
Kod teras:
//使用事务添加联系人
par = Uri contact/contact taktik") ;
Uri dataUri = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = getContentResolver();
ArrayList<OrrayList< operations = new ArrayList<ContentProviderOperation>();
ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri)
//依次是姓名,号码,邮编
ContentProviderOperation op2 = ContentProviderOperation.newInsert(dataUri)< raw > contact_id", 0)
.withValue("mimetype" , "vnd.android.cursor.item/name")
.withValue("data2", "Coder-pig")
.build();
operations.add(op2>);
.build();
operations.add(op2>);<🎜
ContentProviderOperation op3 = ContentProviderOperation.newInsert(dataUri)
.withValueBackReference("raw_contact_id", 0)
android android .item/phone_v2")
. withValue("data1", "13798988888")
.withValue("data2", "2")
.build();
operasi.
.withValue("mimetype", "vnd.android.cursor.item/email_v2")
.withValue("data1", "779878443@qq.com")
.withValue("data2", "2" )
.build();
operations.add(op4);
//Tambah kandungan di atas pada kenalan telefon mudah alih~
resolver.applyBatch("com.android.contacts", operasi ; 🎜>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_PROFILE"/>3. Custom ContentProvider
Kami jarang mentakrifkan ContentProvider sendiri kerana kami sering tidak mahu data aplikasi kami terdedah kepada Untuk aplikasi lain, walaupun ini, anda masih perlu mempelajari cara menggunakan ContentProvider. Terdapat satu lagi cara penghantaran data, kan~
Ini ialah carta alir yang saya lukis sebelum ini:
Seterusnya kita akan melaksanakannya langkah demi langkah:
Sebelum kita bermula, kita mesti membuat kelas penciptaan pangkalan data terlebih dahulu (kandungan pangkalan data akan dibincangkan kemudian~):
DBOpenHelper .java
Rentetan akhir CREATE_SQL = "CREATE TABLE test(_id INTEGER AUTOINAME) ";
DBOpenHelper awam(Konteks konteks, Nama rentetan, kilang CursorFactory,
versi int) {
super(konteks, nama, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SQL);
}
@Override
public void onDatabase(SQL) OldVerssion, int newVersion) {
TODO Stub kaedah jana automatik
Langkah 1: Sesuaikan kelas ContentProvider, laksanakan onCreate(), getType(), dan tulis semula kaedah penambahan, pemadaman, pengubahsuaian dan carian yang sepadan mengikut keperluan:
NameContentProvider.java
//Memulakan beberapa pemalar
penjodoh UriMatcher statik peribadi = UriMatcher baharu (UriMatcher.NO_MATCH);
DBOpenHelper peribadi db>
🎜> //Untuk memudahkan penggunaan UriMatcher secara langsung, addURI di sini, dan kemudian panggil Matcher untuk memadankan
statik{
matcher.addURI("com.jay.example.providers.myprovider", "ujian", 1 ); 🎜> kembalikan benar;
}
@Override
pertanyaan Kursor awam(Uri uri, Unjuran Rentetan[], Pemilihan rentetan,
Rentetan[] selectionArgs, String sortOr der) {
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
uri public uri (uri uri, nilai contentvalues) {
sqlitedatabase db = dbopenHelper.getreadabledatabase (); );
if(rowId > 0)
{
//Tambahkan ID pada Uri yang sedia ada
Nama UriUri = ContentUris.withAppendedId(uri, rowId);
//Data pemberitahuan telah berubah
getContext().getContentRe solver().notifyChange(nameUri , null) ;
return nameUri;
}
}
return null;
}
@Override
public int delete(Uri uri, String selection, String [] selectionArgs ) {
return 0;
}
@Override
kemas kini int awam(Uri uri, ContentValues values, String selection,
String[] selection Args) {
return 0;
}
}
Langkah 2: Daftar ContentProvider dalam AndroidManifest.xml:
<penyedia android:name="com.jay.example.bean.NameContentProvider"
android:authorities="com.jay.example.providers.myprovider"
android Sejak
Baiklah, bahagian sebagai ContentProvider telah selesai!
Seterusnya, buat projek baharu dan mari laksanakan bahagian ContentResolver Kami memasukkan sekeping data secara langsung dengan mengklik butang:
MainActivity.java<. 🎜>
Butang peribadi btninsert;
@Override
dilindungi void onCreate(Bundle savedInstanceState) {
super savedInstanceState);
setContentView(R.layout.activity_main);
btninsert = (Button) findViewById(R.id.btninsert);
//Baca data pembekal kandungan
akhir Penyelesai ContentResolver = this.getContentResolver();
v) {
ContentValues values = new ContentValues();
values.put("name" , "Ujian");
Uri uri = Uri.parse("content://com.jay.example.providers.myprovider/test ");
resolver.insert(uri, values);
Toast.makeText(getApplicationContext(), "Pemasukan data berjaya", Toast.LENGTH_SHORT).show();
}
});
Bagaimana untuk menggunakan? Nah, kodnya agak mudah mula-mula jalankan projek sebagai ContentProvider, dan kemudian jalankan projek sebagai ContentResolver. Klik butang untuk memasukkan sekeping data, kemudian buka penjelajah fail untuk mengeluarkan pangkalan data db ContentProvider dan gunakan alat paparan grafik Anda boleh mencari data yang dimasukkan dan hubungan masa dengan melihatnya Hasilnya tidak akan ditunjukkan~
4 Pantau perubahan data ContentProvider melalui ContentObserver
<🎜. >
Panduan Penggunaan:
Selepas menjalankan program, biarkan sahaja Selepas menerima mesej teks, anda boleh melihat kandungan mesej pada logcat, dan anda boleh menyesuaikannya mengikut keperluan anda. Tukar Activtiy to Service dan lakukan perkara seperti ini di latar belakang~
Ringkasan bahagian ini:
Baiklah, itu sahaja untuk penerokaan awal ContentProvider Dalam bahagian ini kami belajar: Konsep dan proses ContentProvider, menggunakan beberapa ContentProvider yang disediakan oleh sistem, dan menyesuaikan ContentProvider anda sendiri, Akhir sekali, saya juga menerangkan cara memantau perubahan data ContentProvider melalui ContentObserver, dan kandungan ContentProvider hampir dikuasai. Baiklah, mari lihat dokumentasi di bahagian seterusnya untuk melihat jika ada apa-apa yang kami tidak tahu~ Terima kasih