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:

1.jpg


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:

private void getMsgs(){
    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();
}

别忘了,往AndroidManifest.xml加入读取收件箱的权限:

<uses-permission android:name="android.permission.READ_SMS"/>

Keputusan berjalan:

Sebahagian daripada keputusan larian adalah seperti berikut:

2.png


2) Hanya tambahkannya ke peti masuk anda Sisipkan mesej

Kod teras:

private void insertMsg() {
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:

3.png

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:

pribadi void getContacts(){
//①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:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

Keputusan berjalan:

Sebahagian daripada keputusan berjalan adalah seperti berikut:

4.png


4) Tanya kenalan maklumat nombor telefon yang dinyatakan

Kod teras:

pertanyaan tidak sah peribadiHubungi(Nombor rentetan){
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.png


5) Tambah kenalan baharu

Kod teras:

pribadi void AddContact() melempar RemoteException, OperationApplicationException {
    //使用事务添加联系人
 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)
                           operations.add(op1 );

    //依次是姓名,号码,邮编
    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.            .withValueBackReference("raw_contact_id", 0)
.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 ; 🎜>

Jangan lupa kebenaran:

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

<uses-permission android:name="android.permission.WRITE_PROFILE"/>6.gif


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:

7.jpg

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

kelas awam DBOpenHelper melanjutkan SQLiteOpenHelper {

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

kelas awam NameContentProvider memanjangkan ContentProvider {

//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:

< ;!--Atribut adalah mengikut urutan: nama kelas yang layak sepenuhnya, URI yang digunakan untuk pemadanan, sama ada untuk berkongsi data -->
<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<. 🎜>

Aktiviti Utama kelas awam memanjangkan Aktiviti {

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

8.jpg<🎜. >

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