应用情况:与其它应用共享数据 通过 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);