- 应用情况:与其它应用共享数据
- 通过 ContentProvider 获取从数据库获取数据
- Uri 用于 访问不同的 ContentProvider
- 如下图:构建的路径
- 下面是访问 tasks 表的第3行数据
- 通配符的使用
使用 Contact 来构建所需要的 Uri ,下面内嵌的类为创建数据提供。以天气为例
public class WeatherContract {
public static final String CONTENT_AUTHORITY = "com.example.android.sunshine";
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);
public static final String PATH_WEATHER = "weather";
public static final class WeatherEntry implements BaseColumns {
public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
.appendPath(PATH_WEATHER)
.build();
public static final String TABLE_NAME = "weather";
public static final String COLUMN_DATE = "date";
public static final String COLUMN_WEATHER_ID = "weather_id";
public static final String COLUMN_MIN_TEMP = "min";
public static final String COLUMN_MAX_TEMP = "max";
public static final String COLUMN_HUMIDITY = "humidity";
public static final String COLUMN_PRESSURE = "pressure";
public static final String COLUMN_WIND_SPEED = "wind";
public static final String COLUMN_DEGREES = "degrees";
public static Uri buildWeatherUriWithDate(long date) {
return CONTENT_URI.buildUpon()
.appendPath(Long.toString(date))
.build();
}
public static String getSqlSelectForTodayOnwards() {
long normalizedUtcNow = SunshineDateUtils.normalizeDate(System.currentTimeMillis());
return WeatherContract.WeatherEntry.COLUMN_DATE + " >= " + normalizedUtcNow;
}
}
}
1. 使用 URIMathcer 来区分我们需要使用的是在哪种URI。
如 下面的 CODE_WEATHER 用于查询一个完整的表,而CODE_WEATHER_WITH_DATE 用于查询表中的任意一行(使用的通配符)
public static final int CODE_WEATHER = 100;
public static final int CODE_WEATHER_WITH_DATE = 101;
private static final UriMatcher sUriMatcher = buildUriMatcher();
private WeatherDbHelper mOpenHelper;
public static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = WeatherContract.CONTENT_AUTHORITY;
matcher.addURI(authority, WeatherContract.PATH_WEATHER, CODE_WEATHER);
matcher.addURI(authority, WeatherContract.PATH_WEATHER + "/#", CODE_WEATHER_WITH_DATE);
return matcher;
}
使用流程:
1. 扩展至 抽象类 ContentProvider 实现 onCrate() 方法
2. 在 AndroidManifest 中注册你的内容提供器
3. 实现增删改查等方法
4. 需要注意的是 其中又一个 getType 方法用于返回 固定的MIME类型(字符串),如图片的类型等。
5. 记得在进行增删改后更新URi。
getContext().getContentResolver().notifyChange(uri, null);