Android四大组件之ContentProvider,内容提供者

Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。

我们可以在其他应用程通过那些ContentProvider(已经注册到系统)获取这些数据.

下面看一个简单的demo,了解一下在程序中我们如何写自己的ContentProvider

下面是代码:

package com.hithink.datongwms.contentprovider;

import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.hithink.datongwms.app.AppContext;

/**
 * 内容提供者,将自己的数据提供给其他的应用
 * Created by 大漠dreamer on 2018/7/24.
 */

public class MyContentProvider extends ContentProvider {

    private static final String CONTENT = "contact";
    private static final String DATABASE_NAME = "contact.db";
    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    private static final int CONTACT = 1;
    /**
     * 静态代码块
     */
    static {
        uriMatcher.addURI("com.hithink.datongwms", CONTENT, CONTACT);
    }

    private MyDbHelper dbHelp;
    private ContentResolver contentResolver;

    @Override
    public boolean onCreate() {
        Context context = AppContext.getInstance();
        contentResolver = context.getContentResolver();
        //创建数据库
        dbHelp = new MyDbHelper(context, DATABASE_NAME, null, 1);
        return true;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        Uri uri1 = null;
        if (uriMatcher.match(uri) == CONTACT) {
            SQLiteDatabase database = dbHelp.getWritableDatabase();
            long d = database.insert(CONTENT, "_id", values);
            uri1 = ContentUris.withAppendedId(uri, d);
            contentResolver.notifyChange(uri1, null);
        }
        return uri1;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        int id = 0;
        if (uriMatcher.match(uri) == CONTACT) {
            SQLiteDatabase database = dbHelp.getWritableDatabase();
            id = database.delete(CONTENT, selection, selectionArgs);
            contentResolver.notifyChange(uri, null);
        }
        return id;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
                        @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        Cursor cursor = null;
        if (uriMatcher.match(uri) == CONTACT) {
            SQLiteDatabase database = dbHelp.getReadableDatabase();
            cursor = database.query(CONTENT, projection, selection,
                    selectionArgs, null, null, sortOrder);
            cursor.setNotificationUri(contentResolver, uri);
        }
        return cursor;
    }

    /**
     * 利用android自带的SQLite进行数据库的操作
     */
    private static class MyDbHelper extends SQLiteOpenHelper {
        MyDbHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {

            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //创建数据库
            String sql = "create table contact(_id integer primary key autoincrement," +
                    "name text not null,number text not null);";
            db.execSQL(sql);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onCreate(db);
        }
    }
}

 因为ContentProvider为四大组件之一,所以需要在Manifest.xml进行注册,注册代码如下:

 <provider
            android:name=".contentprovider.MyContentProvider"
            android:authorities="com.hithink.datongwms"
            android:enabled="true"
            android:exported="true" />

猜你喜欢

转载自blog.csdn.net/aaa1050070637/article/details/81184215