向其他应用提供数据(内容提供者contentProvider+解析者ContentResolver)--Android快速应用

创建内容提供者

1.首先创建一个类继承contentProvider,该类中需要实现一些方法

public class MyContentProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        // TODO 自动生成的方法存根
        return false;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        // TODO 自动生成的方法存根
        return null;
    }
    @Override
    public String getType(Uri uri) {
        // TODO 自动生成的方法存根
        return null;
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO 自动生成的方法存根
        return null;
    }
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO 自动生成的方法存根
        return 0;
    }
    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        // TODO 自动生成的方法存根
        return 0;
    }
}
image.gif

然后别忘了,contentProvider作为四大组件之一需要在Manifest文件中注册,在注册时除了需要注明名称外还需要添加一个anthorities属性用于标识:



image.gif

2.要使用contentProvider需要通过UriMatcher类的对象。由上面的代码可以得知,内容提供者里的方法多数需要传递一个uri作为参数作为标识。不同的uri分别对应不同的行为。而这些uri是通过UriMatcher提前注册的。一般在使用时,先在类中加载一个静态代码块(会随着类的加载而加载)。使用UriMatcher的addUri方法进行添加。

//在MyContentProvider类里加上
private static final UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
static {
        mUriMatcher.addURI("Thisisauthorities", "query", 25);
        //返回码一般定义为常量
}
image.gif

前两个参数就是String类型的“anthorities”和“path”,这两个参数一起构成了uri。第三个参数为返回码。与addUri方法相对应,UriMatcher中的match方法在调用时会返回一个状态码,如果两个返回码相同,则匹配成功。

3.匹配成功后就可以对数据库进行相应的操作了。通过实现contentProvider的几个方法暴露需要暴露的数据。那么如何规定那些方法/数据可以被访问?答案就是通过之前静态代码块里提前写好的Uri。举个例子:实现query方法

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    // TODO 自动生成的方法存根
    int matchCode = mUriMatcher.match(uri);
    if(matchCode == QUERYSUCCESS) {
        SQLiteDatabase sqd = moh.getReadableDatabase();
        Cursor cursor = sqd.query("mydatabase", projection, selection, selectionArgs, null, null, sortOrder);
        return  cursor;
    }
    return null;
}
image.gif

**************************************************接下来就该访问数据了*************************************************

使用内容解析者访问数据

4.在另一个应用程序中直接通过上下文中的getContentResolver()方法得到ContentResolver。

5.通过ContentResolver对象的“增删改查”方法对数据库进行操作。事实上调用的是contentProvider的增删改查方法。

(6).现在可以对你的数据为所欲为了。

欢迎关注订阅,查看更多分享

你可能感兴趣的:(向其他应用提供数据(内容提供者contentProvider+解析者ContentResolver)--Android快速应用)