ContentProvider

    如果想在多个引用之间共享数据就需要使用该类,如果不需要共享应用的数据则无需使用该类。

    当通过ContentResolver发出URI请求时检测ContentResolverauthority是否已在contentProvider中已注册过。ContentProvider能解析任何它满足条件的URI请求,但是需要UriMatcher类帮助进行解析。

    需要实现的基础方法:

        Query:需要返回哪些数据给调用者;

        Insert:将新的数据添加到contentProvider中;

        Delete:从contentProvider中需要删除哪些数据;

        getType:返回数据在contentProvider中的MIME类型。

    该类需要跨进程访问,所以子类无需考虑是哪一个进程发起的请求。

    contentProvider 实现了ComponentCallbacks接口;ComponentCallbacks接口有两个方法:

    void onConfigurationChanged(Configuration newConfig);

    void onLowMemory();

如果想要添加新的方法到contentprovider中,则同时也需要将同样的方法添加到MockContentPr中。

1.       构造函数

Public ContentProvider(

Content c,//

String readPermission,//希望 readPermission实例能通过测试,则使用getReadPermission()获取readPermission

String writePermiddion,// getWritePermission

PathPermission[] pathPermissions//getPathPermissions

)

2.       方法

a)       Public abstract Cursor query(

Uri uri,//uri是一个从客户端传递过来的完整的URI;如果请求的是明确的记录,那么uri的结尾会有记录编号,分析后添加到wherehaving中明确指定_id的值

String[] projection,//指定需要添加到cursor中的列,null则全部添加

String selection,//筛选的行要满足此条件,null则返回所有行

String[] selectionArgs,//提花selection中的”?”

String sortOrder//记录的排序

);

返回cursornull

b)       Public abstract String getType(

Uri uri//请求的URI

);

返回uri指向的数据的mime类型,当是一条记录时返回以vnd.android.cursor.item开头,当是多条记录时返回以vnd.android.cursor.dir开头。

c)       Public abstract Uri insert(

Uri uri,//从客户端传递过来的完整的URI,指定要插入的对象

ContentValues values//需要插入数据库的值,以键/值对形式保存

)

插入一条新的数据记录,返回一个新插入项的uri

d)       Public int bulkInsert(

Uri uri,

ContentValues[] values

);

        进行批量插入数据,返回传入的记录条数。

调用该方法进行插入新数据是遍历values重复调用insert(uri,values),插入后调用ContentResolver.notifyChange()

e)       Public int delete(

Uri uri,//完整的URI,包含了行的ID

String selection,//删除条件

String[] selectionArgs //替换selection中的”?”

);

        删除一条或多条记录,删除时使用selection进行约束。返回影响的行数。

f)       Public int update(

Uri uri,//请求的URI,若是更新某个具体的记录则需要含有记录的ID

ContentValues values,//新值

String selection,//更新条件

String [] selectionArgs//替换”?”

);

        更新数据,返回影响的行数,更新完成后调用ContentResolver.notifyChange()