ContentProvider(内容提供者)的概述和使用

什么是内容提供者

  • Android平台提供了ContentProvider使一个应用程序的指定数据集提供给其他应用程序,其他应用可以通过ContentResolver类从该内容提供者中获取或者存入数据

  • 只有需要在多个应用程序之间共享数据时才需要ContentProvider,譬如我们的应用要操作手机的通讯录,通讯录则需要提供一个内容提供器,它的好处是统一数据访问方式

  • ContentProvider实现数据共享,ContentProvider用于保存和获取数据,并使其对所有应用程序可见,这是不同程序之间共享数据的唯一方法,因为Android没有提供所有应用共同访问的公共存储区

  • 开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentProvider对象实现对ContentProvider的操作,或者通过ContentObserver来监控别的应用提供的ContentProvider,除非你的应用需要共享数据给其他应用

  • ContentProvider使用URI来唯一标识数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

内容提供者的使用

既然ContentProvider的作用暴露自己的数据给其他应用,那么就需要提供一系列操作的方法来供对方调用
自定义一个类去继承ContentProvider,然后实现其内部方法

  • public boolean onCreate()
    该方法在ContentProvider创建后会被调用,当其他应用第一次访问ContentProvider时,该ContentProvider会被创建出来,并立即回调该onCreate()方法。
    我们常在这个方法中创建要暴露的数据库或者SharedPreferences

  • public Uri inert(Uri uri,ContentValues values)
    根据该Uri插入values对应的数据。
    在这个方法中定义对暴露数据库或者SP的插入操作

  • public int delete(Uri uri,String selection,String[] selectionArgs)
    根据Uri删除select条件所匹配的全部记录。
    在这个方法中定义对暴露数据库或者SP的删除操作

  • public int update(Uri uri,ContentValues values ,String selection,String[] selectionArgs)
    根据Uri修改select条件所匹配的全部记录
    在这个方法中定义对暴露数据库或者SP的更新操作

  • public Cursor query(Uri uri ,String[] projection,String selection ,String[] selectionArgs,String sortOrder)
    根据Uri查询出select条件所匹配的全部记录,其中projection就是列明列表,表明只选择出指定的数据列。
    在这个方法中定义对暴露数据库或者SP的查询操作

  • public String getTypt(Uri uri)
    该方法用于返回当前Uri所代表的数据的MIME类型,如果该Uri对应数据可能包括多条数据,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,如果该Uri对应的数据只包含一条记录,那么返回MIME类型字符串应该以vnd.android.cursor.item/开头。

示例代码:

MyContentProvider.java

/** 
 * 自定义ContentProvider 
 *  
 * @author lixyz 
 * 
 */ 
public class MyContentProvider extends ContentProvider { 

    private SQLiteOpenHelper dataHelper; 
    private SQLiteDatabase database; 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 

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

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
        long newPerson = database.insert("person", null, values); 
        Uri returnUri = Uri.parse(String.valueOf(newPerson)); 
        return returnUri; 
    } 

    @Override 
    public boolean onCreate() { 
        dataHelper = new MyDataHelper(getContext(), "person.db", null, 1); 
        database = dataHelper.getWritableDatabase(); 
        return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
        Cursor cursor = database.query("person", null, selection, selectionArgs, null, null, sortOrder); 
        return cursor; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 

    // 数据库操作 
    class MyDataHelper extends SQLiteOpenHelper { 

        public static final String SQL = "create table if not exists person(_id integer primary key autoincrement ,name text,age integer)"; 

        public MyDataHelper(Context context, String name, CursorFactory factory, int version) { 
            super(context, name, factory, version); 
            // TODO Auto-generated constructor stub 
        } 

        @Override 
        public void onCreate(SQLiteDatabase db) { 
            db.execSQL(SQL); 
        } 

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

        } 
    } 
} 
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1