Android的UriMatcher类用于匹配Uri对吗
时间: 2024-04-06 19:28:26 浏览: 7
是的,Android的UriMatcher类用于匹配Uri。在Android中,Uri(Uniform Resource Identifier)用于唯一标识ContentProvider中的数据。UriMatcher类就是用来匹配Uri的,它可以根据传入的Uri和模式(Pattern)进行匹配,从而确定Uri所对应的操作。
UriMatcher类的使用通常分为两步:
1. 定义Uri模式:可以使用通配符、参数等方式来定义Uri模式,以便匹配多个Uri。
2. 创建UriMatcher对象并进行匹配:在创建UriMatcher对象时,需要将定义好的Uri模式传入其中。之后,可以通过调用UriMatcher对象的match()方法来匹配Uri,该方法会返回一个匹配结果,以便进行相应的操作。
通过UriMatcher类,可以使ContentProvider的Uri匹配变得更加灵活和高效。同时,它也可以保护ContentProvider的数据安全,避免非法访问。
相关问题
android contprovider 案例
Android的ContentProvider是一种数据共享机制,可以让应用程序之间共享数据。下面是一个简单的ContentProvider案例,演示如何创建和使用ContentProvider。
1. 创建ContentProvider类
```java
public class MyContentProvider extends ContentProvider {
private MyDatabaseHelper dbHelper;
private static final UriMatcher uriMatcher;
private static final int PERSONS = 1;
private static final int PERSON_ID = 2;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.myapp.provider", "persons", PERSONS);
uriMatcher.addURI("com.example.myapp.provider", "persons/#", PERSON_ID);
}
@Override
public boolean onCreate() {
dbHelper = new MyDatabaseHelper(getContext(), "myapp.db", null, 1);
return true;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = null;
switch (uriMatcher.match(uri)) {
case PERSONS:
cursor = db.query("persons", projection, selection, selectionArgs, null, null, sortOrder);
break;
case PERSON_ID:
String id = uri.getPathSegments().get(1);
cursor = db.query("persons", projection, "id=?", new String[]{id}, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
return cursor;
}
@Nullable
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)) {
case PERSONS:
return "vnd.android.cursor.dir/persons";
case PERSON_ID:
return "vnd.android.cursor.item/person";
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri uriReturn = null;
switch (uriMatcher.match(uri)) {
case PERSONS:
case PERSON_ID:
long newId = db.insert("persons", null, values);
uriReturn = Uri.parse("content://com.example.myapp.provider/persons/" + newId);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
return uriReturn;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = 0;
switch (uriMatcher.match(uri)) {
case PERSONS:
count = db.delete("persons", selection, selectionArgs);
break;
case PERSON_ID:
String id = uri.getPathSegments().get(1);
count = db.delete("persons", "id=?", new String[]{id});
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
return count;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
int count = 0;
switch (uriMatcher.match(uri)) {
case PERSONS:
count = db.update("persons", values, selection, selectionArgs);
break;
case PERSON_ID:
String id = uri.getPathSegments().get(1);
count = db.update("persons", values, "id=?", new String[]{id});
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
return count;
}
}
```
2. 创建数据库类
```java
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String CREATE_PERSONS = "create table persons ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "age integer)";
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_PERSONS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
```
3. 在AndroidManifest.xml中添加ContentProvider
```xml
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="true" />
```
4. 使用ContentProvider
```java
Uri uri = Uri.parse("content://com.example.myapp.provider/persons");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{"id", "name", "age"}, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d(TAG, "id=" + id + ", name=" + name + ", age=" + age);
}
cursor.close();
}
```
以上就是一个简单的ContentProvider案例,通过这个案例可以学习如何创建和使用ContentProvider。
android provider用法
Android Provider 是 Android 系统提供的一种数据存储方式,它提供了可供其他应用程序访问的公共数据集合。使用 Provider 可以实现数据共享,使得不同的应用程序可以访问和修改同一数据集合,从而实现数据的共享和协作。
在 Android 中,Provider 通常用于存储和共享应用程序的数据,比如联系人、短信、音乐、视频等。开发者可以通过 ContentResolver 类来访问 Provider 中的数据。
使用 Provider 的步骤如下:
1. 创建数据表结构:定义 Provider 中所需的数据表结构;
2. 创建 ContentProvider 子类:实现 Provider 中的 CRUD(增删改查)操作;
3. 在 AndroidManifest.xml 文件中注册 ContentProvider:声明 Provider 的信息;
4. 在应用程序中使用 ContentResolver 访问 Provider 中的数据。
接下来是一个简单的示例,演示如何创建一个 Provider 并向其中插入一条数据:
1. 首先,定义 Provider 中需要使用的数据表结构,比如:
```
public class MyProvider extends SQLiteOpenHelper {
// 声明数据库名和版本号
public static final String DB_NAME = "my_provider.db";
public static final int DB_VERSION = 1;
// 声明数据表名和字段名
public static final String TABLE_NAME = "users";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
// 构造函数
public MyProvider(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
// 创建数据表
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_NAME + " ("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ COLUMN_NAME + " TEXT NOT NULL"
+ ");");
}
// 升级数据表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
```
2. 然后,创建一个 ContentProvider 子类,继承自 ContentProvider,并实现 CRUD 操作,比如:
```
public class MyContentProvider extends ContentProvider {
// 声明 Provider 的唯一标识
public static final String AUTHORITY = "com.example.myprovider";
// 声明 UriMatcher 对象
private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int USERS = 1;
private static final int USER_ID = 2;
// 声明 MyProvider 对象
private MyProvider mProvider;
// 初始化 UriMatcher
static {
sUriMatcher.addURI(AUTHORITY, MyProvider.TABLE_NAME, USERS);
sUriMatcher.addURI(AUTHORITY, MyProvider.TABLE_NAME + "/#", USER_ID);
}
// 获取 ContentProvider 所使用的数据源
@Override
public boolean onCreate() {
mProvider = new MyProvider(getContext());
return true;
}
// 查询数据
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = mProvider.getReadableDatabase();
Cursor cursor = null;
switch (sUriMatcher.match(uri)) {
case USERS:
cursor = db.query(MyProvider.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case USER_ID:
String id = uri.getLastPathSegment();
cursor = db.query(MyProvider.TABLE_NAME, projection, MyProvider.COLUMN_ID + "=?", new String[]{id}, null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
// 插入数据
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = mProvider.getWritableDatabase();
long id = db.insert(MyProvider.TABLE_NAME, null, values);
if (id > 0) {
Uri itemUri = ContentUris.withAppendedId(uri, id);
getContext().getContentResolver().notifyChange(uri, null);
return itemUri;
} else {
throw new SQLException("Failed to insert row into " + uri);
}
}
// 更新数据
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
SQLiteDatabase db = mProvider.getWritableDatabase();
int count = 0;
switch (sUriMatcher.match(uri)) {
case USERS:
count = db.update(MyProvider.TABLE_NAME, values, selection, selectionArgs);
break;
case USER_ID:
String id = uri.getLastPathSegment();
count = db.update(MyProvider.TABLE_NAME, values, MyProvider.COLUMN_ID + "=?", new String[]{id});
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
// 删除数据
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = mProvider.getWritableDatabase();
int count = 0;
switch (sUriMatcher.match(uri)) {
case USERS:
count = db.delete(MyProvider.TABLE_NAME, selection, selectionArgs);
break;
case USER_ID:
String id = uri.getLastPathSegment();
count = db.delete(MyProvider.TABLE_NAME, MyProvider.COLUMN_ID + "=?", new String[]{id});
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
// 获取 MIME 类型
@Override
public String getType(Uri uri) {
switch (sUriMatcher.match(uri)) {
case USERS:
return "vnd.android.cursor.dir/" + AUTHORITY + "." + MyProvider.TABLE_NAME;
case USER_ID:
return "vnd.android.cursor.item/" + AUTHORITY + "." + MyProvider.TABLE_NAME;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
}
}
```
3. 在 AndroidManifest.xml 文件中注册 ContentProvider,比如:
```
<provider
android:name=".MyContentProvider"
android:authorities="com.example.myprovider"
android:exported="false" />
```
4. 在应用程序中使用 ContentResolver 访问 Provider 中的数据,比如:
```
// 查询用户列表
Cursor cursor = getContentResolver().query(Uri.parse("content://com.example.myprovider/users"), null, null, null, null);
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex(MyProvider.COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(MyProvider.COLUMN_NAME));
Log.d(TAG, "id=" + id + ", name=" + name);
}
// 插入一条用户数据
ContentValues values = new ContentValues();
values.put(MyProvider.COLUMN_NAME, "Alice");
Uri uri = getContentResolver().insert(Uri.parse("content://com.example.myprovider/users"), values);
Log.d(TAG, "insert uri: " + uri);
// 更新用户数据
values.put(MyProvider.COLUMN_NAME, "Bob");
int count = getContentResolver().update(Uri.parse("content://com.example.myprovider/users/1"), values, null, null);
Log.d(TAG, "update count: " + count);
// 删除用户数据
count = getContentResolver().delete(Uri.parse("content://com.example.myprovider/users/1"), null, null);
Log.d(TAG, "delete count: " + count);
```