自定义ContentProvider及使用ContentResolver解析详细步骤

原创 2016年06月02日 09:33:05

1、在一个提供私有数据的应用中创建一个数据库,包含两张表,继承 SQLiteOpenHelper

package com.example.privatedatabase;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
    public MyOpenHelper(Context context) {
        super(context, "Account.db", null, 1);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("create table info(_id integer primary key AUTOINCREMENT,name varchar(20),money varchar(20))");
        db.execSQL("insert into info(name,money) values(?,?)", new String[] {
            "张三", "5000" });
        db.execSQL("insert into info(name,money) values(?,?)", new String[] {
            "李四", "3000" });

        db.execSQL("create table telephony(_id integer primary key AUTOINCREMENT,name varchar(20),phoneNo varchar(20))");
        db.execSQL("insert into telephony(name,phoneNo) values(?,?)", new String[] {
            "张三", "13932568098" });
        db.execSQL("insert into telephony(name,phoneNo) values(?,?)", new String[] {
            "李四", "13230569896" });
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
    }
}

2、在提供私有数据的应用中创建一个内容提供者,向外暴露CRUD方法

package com.example.privatedatabase;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class AccountProvider extends ContentProvider {
    private SQLiteDatabase db;
    private static final int INFO_QUERY_SUCCESS = 1;
    private static final int INFO_INSERT_SUCCESS = 2;
    private static final int INFO_DELETE_SUCCESS = 3;
    private static final int INFO_UPDATE_SUCCESS = 4;
    private static final int TELEPHONY_QUERY_SUCCESS = 5;
    private static final int TELEPHONY_INSERT_SUCCESS = 6;
    private static final int TELEPHONY_DELETE_SUCCESS = 7;
    private static final int TELEPHONY_UPDATE_SUCCESS = 8;
    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    static {
        sUriMatcher.addURI("com.zhjg.provider", "queryInfo", INFO_QUERY_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "insertInfo",INFO_INSERT_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "deleteInfo",INFO_DELETE_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "updateInfo",INFO_UPDATE_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "queryTelephony",TELEPHONY_QUERY_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "insertTelephony",TELEPHONY_INSERT_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "deleteTelephony",TELEPHONY_DELETE_SUCCESS);
        sUriMatcher.addURI("com.zhjg.provider", "updateTelephony",TELEPHONY_UPDATE_SUCCESS);
    }
    @Override
    public boolean onCreate() {
        MyOpenHelper helper = new MyOpenHelper(getContext());
        db = helper.getReadableDatabase();
        return false;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
        int code = sUriMatcher.match(uri);
        if (code == INFO_QUERY_SUCCESS) {
            Cursor cursor = db.query("info", projection, selection,
                selectionArgs, null, null, sortOrder);
            return cursor;
        } else if (code == TELEPHONY_QUERY_SUCCESS) {
            Cursor cursor = db.query("telephony", projection, selection,
                selectionArgs, null, null, sortOrder);
            return cursor;
        } else {
            throw new IllegalArgumentException("路径不匹配或当前数据库中没有数据结果!");
        }
    }
    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = sUriMatcher.match(uri);
        if (code == INFO_INSERT_SUCCESS) {
            /**
             * return: the row ID of the newly inserted row, or -1 if an error
             * occurred
             */
            long id = db.insert("info", null, values);
            return ContentUris.withAppendedId(uri, id);
        } else if (code == TELEPHONY_INSERT_SUCCESS) {
            long id = db.insert("telephony", null, values);
            return ContentUris.withAppendedId(uri, id);
        } else {
            return null;
        }
    }
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int code = sUriMatcher.match(uri);
        if (code == INFO_DELETE_SUCCESS) {
            int count = db.delete("info", selection, selectionArgs);
            return count;
        } else if (code == TELEPHONY_DELETE_SUCCESS) {
            int count = db.delete("telephony", selection, selectionArgs);
            return count;
        } else {
            return 0;
        }
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
        int code = sUriMatcher.match(uri);
        if (code == INFO_UPDATE_SUCCESS) {
            int count = db.update("info", values, selection, selectionArgs);
            return count;
        } else if (code == TELEPHONY_UPDATE_SUCCESS) {
            int count = db
                .update("telephony", values, selection, selectionArgs);
            return count;
        } else {
            return 0;
        }
    }
}

3、在提供私有数据的应用的清单文件中注册此ContentProvider

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.privatedatabase"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.privatedatabase.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="com.example.privatedatabase.AccountProvider"
            android:authorities="com.zhjg.provider" >
        </provider>
    </application>
</manifest>

4、在其它应用中使用 ContentResolver 中解析 ContentProvider 中的数据

package com.example.readprivatedatabase;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
public class MainActivity extends ActionBarActivity {
    private ContentResolver resolver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        resolver = getContentResolver();
    }
    public void clickInsertM(View v) {
        // 这里只能逐条添加记录
        ContentValues values = new ContentValues();
        values.put("name", "王五");
        values.put("money", "10000");
        resolver.insert(Uri.parse("content://com.zhjg.provider/insertInfo"),
            values);
    }
    public void clickUpdateM(View v) {
        ContentValues values = new ContentValues();
        values.put("money", "18800");
        resolver.update(Uri.parse("content://com.zhjg.provider/updateInfo"),
            values, "name=?", new String[] { "王五" });
    }
    public void clickDeleteM(View v) {
        resolver.delete(Uri.parse("content://com.zhjg.provider/deleteInfo"),
            "name=?", new String[] { "王五" });
    }
    public void clickQueryM(View v) {
        Cursor cursor = resolver.query(
            Uri.parse("content://com.zhjg.provider/queryInfo"), null, null,
            null, null);
        while (cursor.moveToNext()) {
            System.out.println("使用内容提供者,以按钮点击::"
                + cursor.getInt(cursor.getColumnIndex("_id")) + " -- "
                + cursor.getString(cursor.getColumnIndex("name")) + " -- "
                + cursor.getString(cursor.getColumnIndex("money")));
        }
    }
    public void clickInsertP(View v) {
        // 这里只能逐条添加记录
        ContentValues values = new ContentValues();
        values.put("name", "王五");
        values.put("phoneNo", "phoneNo10000");
        resolver.insert(Uri.parse("content://com.zhjg.provider/insertTelephony"),
            values);
    }
    public void clickUpdateP(View v) {
        ContentValues values = new ContentValues();
        values.put("phoneNo", "phoneNo18800");
        resolver.update(
            Uri.parse("content://com.zhjg.provider/updateTelephony"),
            values, "name=?", new String[] { "王五" });
    }
    public void clickDeleteP(View v) {
        resolver.delete(
            Uri.parse("content://com.zhjg.provider/deleteTelephony"),
            "name=?", new String[] { "王五" });
    }
    public void clickQueryP(View v) {
        Cursor cursor = resolver.query(
            Uri.parse("content://com.zhjg.provider/queryTelephony"), null,
            null, null, null);
        while (cursor.moveToNext()) {
            System.out.println("使用内容提供者,以按钮点击::"
                + cursor.getInt(cursor.getColumnIndex("_id")) + " -- "
                + cursor.getString(cursor.getColumnIndex("name")) + " -- "
                + cursor.getString(cursor.getColumnIndex("phoneNo")));
        }
    }
}

布局文件

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.readprivatedatabase.MainActivity" >
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:onClick="clickInsertM"
        android:text="增加M" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button1"
        android:onClick="clickUpdateM"
        android:text="修改M" />
    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button2"
        android:layout_below="@+id/button2"
        android:onClick="clickDeleteM"
        android:text="删除M" />
    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button3"
        android:layout_below="@+id/button3"
        android:onClick="clickQueryM"
        android:text="查询全部M" />
    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_marginLeft="42dp"
        android:layout_toRightOf="@+id/button4"
        android:onClick="clickInsertP"
        android:text="增加P" />
    <Button
        android:id="@+id/button6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button2"
        android:layout_alignBottom="@+id/button2"
        android:layout_alignLeft="@+id/button5"
        android:onClick="clickUpdateP"
        android:text="修改P" />
    <Button
        android:id="@+id/button7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/button4"
        android:layout_alignLeft="@+id/button6"
         android:onClick="clickDeleteP"
        android:text="删除P"  />
    <Button
        android:id="@+id/button8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button7"
        android:layout_below="@+id/button7"
         android:onClick="clickQueryP"
        android:text="查询全部P" />
</RelativeLayout>

5、图片效果
分别更改info和telephony

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

自定义ContentProvider以及ContentObserver的使用完整详细示例

示例说明: 该示例中一共包含两个工程。其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserver...
  • lfdfhl
  • lfdfhl
  • 2014年12月18日 12:35
  • 1587

自定义ContentProvider以及ContentObserver的使用完整详细示例

示例说明: 该示例中一共包含两个工程。其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserve...
  • Qiqihar
  • Qiqihar
  • 2016年03月11日 10:58
  • 214

ContentProvider 和ContentResolver内容提供者和内容解析者

内容提供程序管理对中央数据存储库的访问。提供程序是 Android 应用的一部分,通常提供自己的 UI 来使用数据。 但是,内容提供程序主要旨在供其他应用使用,这些应用使用提供程序客户端对象来访问提供...

使用ContentProvider和ContentResolver实现应用程序间的数据共享

MyProvider项目中的MyProvider.java package practise.lxm.myprodiver; import android.content.ContentProvid...

ContentProvider与ContentResolver使用

如下内容为从网络转载: 使用ContentProvider共享数据: 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自定义ContentProvider及使用ContentResolver解析详细步骤
举报原因:
原因补充:

(最多只允许输入30个字)