Android内容提供者使用及创建

先介绍一下,ContentProvider可以进行应用间的数据交换,即向其他应用暴露自己想暴露的数据。

实际应用中大多数情况下应该是使用Android系统自带的内容提供者来向Android自带的数据库(短信,联系人,通话记录等等)进行操作。

(一)先给大家介绍一个简单的内容提供者的实现及使用。

1 需要建立一自己的Provider 继承ContentProvider

下面是自己的一个AccountProviderr的实现:

只实现了一个查询的方法

package com.example.day09_pracontentprovider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class AccountProviderr extends ContentProvider{
    private MyOpenHelper myOpenHelper;   //自定义的数据库
    private static final int QUERYSUCCESS = 0; //定义的常量用来匹配要进行的操作

    // 1 路径匹配器
    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    // 2 静态代码块 添加匹配规则
    static{
        
//        url      http://www.baidu.com
//        uri:         com.zyf.provider/query
        sURIMatcher.addURI("com.zyf.provider", "query", QUERYSUCCESS);
    }
    
    @Override
    public boolean onCreate() {
        myOpenHelper=new MyOpenHelper(getContext());
        return false;
    }
    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public String getType(Uri arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri arg0, ContentValues arg1) {
        // TODO Auto-generated method stub
        return null;
    }

   public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
      int code=sURIMatcher.match(uri);   //获取Uri的匹配码
        if (code == QUERYSUCCESS) {       //如果匹配 进行查询 返回 查询结果cursor
            SQLiteDatabase db=myOpenHelper.getReadableDatabase();
            Cursor cursor = db.query("info", null, null,null,null, null, null);
            System.out.println("我是内容提供者的");
            return cursor;//Returns:A Cursor object, which is positioned before the first entry.
        } else{                          // 不匹配 返回null
            return null;
        }
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        return 0;
    }

}

这里要注意在清单文件中声明自己创建的内容提供者时要将android:exported="true"

<provider android:name="com.example.day09_pracontentprovider.AccountProviderr"
       android:authorities="com.zyf.provider"
          android:exported="true">

下面是一个MyOpenHelper类

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, "info.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase arg0) {
        arg0.execSQL("create table info (_id integer primary key autoincrement,name varchar(20)," +
                "phone varchar(20),number varchar(20))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        
    }

}

在另一个应用中使用上面建立的内容提供者

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Uri uri=Uri.parse("content://com.zyf.provider/query");
        Cursor cursor=getContentResolver().query(uri, null, null,null, null);
        
        if(cursor !=null && cursor.getCount()>0){
            while(cursor.moveToNext()){
                String name=cursor.getString(1);
                String phone=cursor.getString(2);
                System.out.println("-----name"+name+"------"+phone);
            }
        }
    }
}

(二)使用Android系统自带的Provider

使用Android自带的内容提供者其实相当的简单

                Uri uri=Uri.parse("content://sms");    //uri在Android的源码中可以查看
ContentValues values=new ContentValues(); values.put("address", "132454854"); values.put("date", System.currentTimeMillis()); values.put("body", "I am message body"); getContentResolver().insert(uri, values);//获取内容提供者并插入

这样几行代码便实现了向你的手机中添加一条信息。

内容有问题请大家告知我,我会在第一时间内进行更改哦

原文地址:https://www.cnblogs.com/zzl521/p/8846448.html