具体解析如何根据URI找到对应的数据库的那张表

<application android:label="@string/calendar_storage"
                 android:icon="@drawable/app_icon">
        <!-- TODO: Remove dependency of application on the test runner
             (android.test) library. -->
        <uses-library android:name="android.test.runner" />

        <provider android:name="CalendarProvider2" android:authorities="com.android.calendar"
                android:label="@string/provider_label"
                android:multiprocess="false"
                android:readPermission="android.permission.READ_CALENDAR"
                android:writePermission="android.permission.WRITE_CALENDAR" />


这里在配置文件里面的Application里面定义了(指定了)每个.java文件所能用到的数据库。这样当你contentResolver实例时,就是取这个指定数据库的各个方法接口的实例。
通过android:authorities="com.android.calendar"这个权限,指定了该从属于哪个provider;

在代码中通过:

定义URI:  public static final Uri  CONTENT_URI  = Uri.parse("content://" + AUTHORITY + "/calendars");
定义AUTHORITY:  public static final String AUTHORITY = "com.android.calendar";
使用URI:   mQueryHandler.startQuery(0, null, Calendars. CONTENT_URI , CALENDARS_PROJECTION,
                    CALENDARS_WHERE, null /* selection args */, null /* sort order */);
系统根据URI查找到数据库的实现:1.根据AUTHORITY = "com.android.calendar";到配置文件Manifest.xml文件的<provider标签里面找〉
如下:<provider android:name="CalendarProvider2" android:authorities="com.android.calendar"
从而我们知道,authorities="com.android.calendar"对应的数据库是CalendarProvider2,从而我们找CalendarProvider2.java ;

注:有些时候不会明确的制定是哪个数据库,但是根下去会发现一般都是指本应用所使用的数据库;
mQueryHandler = new QueryHandler(getContentResolver());
public ContentResolver getContentResolver() {
        return mBase.getContentResolver();
    }
这里mBase就是指本应用的数据库;


而具体是哪张表呢??
这时就用到 Uri.parse("content://" + AUTHORITY + "/calendars");最后一个参数了,其代表表名;即calendars这张表:

具体的查询数据库中的某张表,1。定义一个 该种数据库 的contentResolver实例,
                                                  2.通过该实例对象使用该数据库实现好的query方法。
                                                 3.跳到该数据库实现的query方法里面,从而走里面的代码流程,(一般都是根据你提供的URI,来分段解析,最后一段解析为数据库的具体的一张表)

注:在上面第3步的解析中,一般会有一个专门的解析函数,uri.match方法;
然后选择具体哪张表在走,switch()语句;


如下:



public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        if (Log.isLoggable(TAG, Log.VERBOSE)) {
            Log.v(TAG, "query uri - " + uri);
        }

        final SQLiteDatabase db = mDbHelper.getReadableDatabase();

        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        String groupBy = null;
        String limit = null; // Not currently implemented

        final int match = sUriMatcher.match(uri);
        switch (match) {
            case SYNCSTATE:
                return mDbHelper.getSyncState().query(db, projection, selection,  selectionArgs,
                        sortOrder);

            case EVENTS:
                qb.setTables(CalendarDatabaseHelper.Views.EVENTS);
                qb.setProjectionMap(sEventsProjectionMap);
                appendAccountFromParameter(qb, uri);
                break;
            case EVENTS_ID:
                qb.setTables(CalendarDatabaseHelper.Views.EVENTS);
                qb.setProjectionMap(sEventsProjectionMap);
                selectionArgs = insertSelectionArg(selectionArgs, uri.getPathSegments().get(1));
                qb.appendWhere("_id=?");
                break;



contentResolver是取当前数据库的接口的一个实例,通过这个接口,我们可以调用数据库里面实现的具体方法(query,delete);
并且通过URI,找到制定的表;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值