联系人ProfileProvider

转载请注明出处:http://blog.csdn.net/droyon/article/details/9150639

ProfileProvider继承自AbstractContyactsProvider。

源代码请自行下载

package com.android.providers.contacts;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

import java.io.FileNotFoundException;
import java.util.Locale;

/**
 * Simple content provider to handle directing profile-specific calls against a separate
 * database from the rest of contacts.
 */
public class ProfileProvider extends AbstractContactsProvider {

    private static final String READ_PERMISSION = "android.permission.READ_PROFILE";
    private static final String WRITE_PERMISSION = "android.permission.WRITE_PROFILE";

    // The Contacts provider handles most of the logic - this provider is only invoked when the
    // URI belongs to a profile action, setting up the proper database.
    private final ContactsProvider2 mDelegate;

    public ProfileProvider(ContactsProvider2 delegate) {
        mDelegate = delegate;
    }

    /**
     * Performs a permission check on the read profile permission.  Checks the delegate contacts
     * provider to see whether this is an authorized one-time-use URI.
     * @param uri The URI being accessed.
     */
    public void enforceReadPermission(Uri uri) {//检查是否有读权限
        if (!mDelegate.isValidPreAuthorizedUri(uri)) {
            mDelegate.getContext().enforceCallingOrSelfPermission(READ_PERMISSION, null);
        }
    }

    /**
     * Performs a permission check on the write profile permission.
     */
    public void enforceWritePermission() {//检查是否有写权限
        mDelegate.getContext().enforceCallingOrSelfPermission(WRITE_PERMISSION, null);
    }
    /**
     * 重写getDatabaseHelper,父类的方法
     */
    @Override
    protected ProfileDatabaseHelper getDatabaseHelper(Context context) {
        return ProfileDatabaseHelper.getInstance(context);
    }

    @Override
    protected ThreadLocal<ContactsTransaction> getTransactionHolder() {//得到线程本地存储的对象
        return mDelegate.getTransactionHolder();
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder) {
        enforceReadPermission(uri);//检查权限,如果没有权限抛出异常
        mDelegate.substituteDb(getDatabaseHelper().getReadableDatabase());//替换数据库  profile.db
        return mDelegate.queryLocal(uri, projection, selection, selectionArgs, sortOrder, -1);
    }

    @Override
    protected Uri insertInTransaction(Uri uri, ContentValues values) {
        enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
        useProfileDbForTransaction();//启动触发器,并切换数据库到profile.db
        return mDelegate.insertInTransaction(uri, values);
    }

    @Override
    protected int updateInTransaction(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
        useProfileDbForTransaction();//启动触发器,并切换数据库到profile.db
        return mDelegate.updateInTransaction(uri, values, selection, selectionArgs);
    }

    @Override
    protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
        enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
        useProfileDbForTransaction();//启动触发器,并切换数据库到profile.db
        return mDelegate.deleteInTransaction(uri, selection, selectionArgs);
    }

    @Override
    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException {
        if (mode != null && mode.contains("w")) {
            enforceWritePermission();//检查写权限,如果不存在权限,抛出异常
            mDelegate.substituteDb(getDatabaseHelper().getWritableDatabase());//切换到profile.db上
        } else {
            enforceReadPermission(uri);//检查权限,如果不存在权限,抛出异常
            mDelegate.substituteDb(getDatabaseHelper().getReadableDatabase());
        }
        return mDelegate.openAssetFileLocal(uri, mode);
    }

    private void useProfileDbForTransaction() {
        ContactsTransaction transaction = getCurrentTransaction();//得到线程本地存储,mTreasactionLocal来自mDelegate对象
        SQLiteDatabase db = getDatabaseHelper().getWritableDatabase();//子类重写了getDatabaseHelper()方法  profile.db。
        transaction.startTransactionForDb(db, ContactsProvider2.PROFILE_DB_TAG, this);
        mDelegate.substituteDb(db);//切换数据库到profile.db
    }

    @Override
    protected void notifyChange() {
        mDelegate.notifyChange();
    }

    protected void notifyChange(boolean syncToNetwork) {
        mDelegate.notifyChange(syncToNetwork);
    }

    protected Locale getLocale() {
        return mDelegate.getLocale();
    }

    public void onBegin() {
        mDelegate.switchToProfileMode();
        mDelegate.onBegin();
    }

    public void onCommit() {
        mDelegate.switchToProfileMode();
        mDelegate.onCommit();
    }

    @Override
    public void onRollback() {
        mDelegate.switchToProfileMode();
        mDelegate.onRollback();
    }

    @Override
    protected boolean yield(ContactsTransaction transaction) {
        return mDelegate.yield(transaction);
    }

    @Override
    public String getType(Uri uri) {
        return mDelegate.getType(uri);
    }
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值