Latest web development tutorials

Android Content Provider (Content Provider)

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.

gambar

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 {

}

konten URI

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

Buat penyedia konten

langkah-langkah sederhana yang dijelaskan di sini penyedia untuk membuat konten mereka sendiri.

  • Pertama, Anda perlu membuat kelas turunan ContentProviderbase kelas penyedia konten.
  • Kedua, Anda perlu menentukan konten Anda untuk mengakses penyedia konten alamat URI.
  • Selanjutnya, Anda perlu membuat database untuk menyimpan konten. Biasanya, Android menggunakan database SQLite dan menimpa onCreate () metode yang digunakan dalam rangka metode SQLiteOpenHelper untuk membuat atau membuka penyedia basis data. Bila aplikasi Anda mulai, metode yang setiap penyedia konten onCreate () akan dipanggil di thread utama aplikasi.
  • Akhirnya, menggunakan <penyedia ... /> tag yang terdaftar di penyedia konten AndroidManifest.xml.

Berikut ini adalah penyedia konten untuk mendapatkan pekerjaan Anda, Anda perlu beberapa metode dalam ditulis ulang kelas ContentProvider:

gambar

  • onCreate (): Disebut ketika penyedia dimulai.
  • query (): Metode ini menerima permintaan dari klien. Hasilnya adalah kembalinya pointer (kursor) objek.
  • masukkan (): penyedia konten Metode ini untuk menyisipkan catatan baru.
  • menghapus (): Metode ini dihapus dari penyedia konten dalam catatan yang ada.
  • update (): Metode ini update penyedia konten dalam catatan yang ada.
  • getType (): Metode ini mengembalikan diberikan URI jenis metadata.

contoh

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

gambar

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.

gambar

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.