涉及文件:
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,