ContentProvider使用与query流程分析

涉及文件:

frameworks\base\core\java\android\content\pm\PackageParser.java

frameworks\base\core\java\android\app\ContextImpl.java

frameworks\base\core\java\android\app\ActivityThread.java

frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java

frameworks\base\core\java\android\content\ContentResolver.java

frameworks\base\core\java\android\content\ContentProvider.java

 

contentProvider使用示例:

Manifest文件中定义provider,指定authorities,permission,权限还可以细分为readpermission和writepermission。

<provider
    android:authorities="com.qiku.healthguard.healthdata"
    android:name="com.qiku.healthguard.provide.HealthProvider"
    android:exported="true"
    android:permission="com.qiku.permission.GET_HG_DATA"
    />

新建类继承自ContentProvider,重载query,insert,delete,update四个接口,分别实现数据库的增删改查

public class HealthProvider extends ContentProvider {private final static String TAG = "HealthProvider:";
private DbHelper dbHelper;
private static final UriMatcher matcher;
static {
    matcher = new UriMatcher(UriMatcher.NO_MATCH);
    matcher.addURI(DbConstant.AUTHOR,DbConstant.TB_FATIGUE,DbConstant.CODE_FATIGUE);
    matcher.addURI(DbConstant.AUTHOR,DbConstant.TB_HEALTH_REPORT,DbConstant.CODE_HEALTH_REPORT);
    matcher.addURI(DbConstant.AUTHOR,DbConstant.TB_SLEEP,DbConstant.CODE_SLEEP);
    matcher.addURI(DbConstant.AUTHOR,DbConstant.TB_TIME_SET,DbConstant.CODE_TIME);
    matcher.addURI(DbConstant.AUTHOR,DbConstant.TB_SCREEN,DbConstant.CODE_SCREEN);
}

@Override
public boolean onCreate() {
    dbHelper = new DbHelper(getContext());
    return true;
}

@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,
                    @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    String table = getType(uri);
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    if(table==null || database==null) {
        return null;
    }
    Cursor cursor = database.query(table,projection,selection,selectionArgs,null,null,sortOrder);
    return cursor;
}

@Nullable
@Override
public String getType(@NonNull Uri uri) {
    String table = null;
    switch (matcher.match(uri)) {
        case DbConstant.CODE_FATIGUE:
            table = DbConstant.TB_FATIGUE;
            break;
        case DbConstant.CODE_HEALTH_REPORT:
            table = DbConstant.TB_HEALTH_REPORT;
            break;
        case DbConstant.CODE_SLEEP:
            table = DbConstant.TB_SLEEP;
            break;
        case DbConstant.CODE_TIME:
            table = DbConstant.TB_TIME_SET;
            break;
        case DbConstant.CODE_SCREEN:
            table = DbConstant.TB_SCREEN;
            break;
        default:
            break;
    }
    return table;
}

@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
    String table  = getType(uri);
    SQLiteDatabase database = dbHelper.getWritableDatabase();
    database.insert(table,null,contentValues);
    return uri;
}

@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
    String table = getType(uri);
    SQLiteDatabase database = dbHelper.getWritableDatabase();
    int i = database.delete(table,selection,selectionArgs);
    return 0;
}

@Override
public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String selection,
                  @Nullable String[] selectionArgs) {
    String table = getType(uri);
    SQLiteDatabase database = dbHelper.getWritableDatabase();
    int i = database.update(table,contentValues,selection,selectionArgs);
    return 0;
}
}

新建类继承自SQLiteOpenHelper,分别实现构造方法和onCreate(完成数据库新建操作)、onUpgrade(完成数据库升级)、onDowngrade(完成数据库的降级)

public class DbHelper extends SQLiteOpenHelper {

    public static String CREATE_FATIGUE="CREATE TABLE IF NOT EXISTS fatigue(" +
            "id INTEGER PRIMARY KEY," +
            "total_s INT DEFAULT 0," +
            "total_m INT DEFAULT 0," +
            "total_mi INT DEFAULT 0," +
            "total_f INT DEFAULT 0," +
            "unlock_s INT DEFAULT 0," +
            "unlock_m INT DEFAULT 0," +
            "unlock_mi INT DEFAULT 0," +
            "unlock_f INT DEFAULT 0," +
            "app_s INT DEFAULT 0," +
            "app_m INT DEFAULT 0," +
            "app_mi INT DEFAULT 0," +
            "app_f INT DEFAULT 0" +
            ");";
    public static final String CREATE_SLEEP = "CREATE TABLE IF NOT EXISTS sleep_data(" +
            "id INTEGER PRIMARY KEY," +
            "start_time INTEGER DEFAULT 0," +
            "end_time INTEGER DEFAULT 0," +
            "sleep_time INTEGER DEFAULT 0," +
            "weekdata VARCHAR(50) DEFAULT NULL," +
            "modify_time LONG);";
    public static final String CREATE_TIME = "CREATE TABLE IF NOT EXISTS time_data(" +
            "id INTEGER PRIMARY KEY," +
            "notice_enable INTEGER DEFAULT 1," +
            &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值