1、ContentProvider
是android的四大组件之一,作用是对外共享数据,就是把自已应用程序里的数据分享给其他应用程序,其他应用可以通过ContentProvider对你应用中的数据进行添删改查。使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
ContentProvider(内容提供者)用于提供数据的统一访问格式,封装底层的具体实现。对于数据的使用者来说,无需知晓数据的来源是数据库、文件,或者网络,只需简单地使用ContentProvider提供的数据操作接口,也就是增(insert)、删(delete)、改(update)、查(query)四个过程。
contentprovider是一个抽象类,想要拥有自己的provider就必须继承自这个类并重写想要实现的方法,并且在manifest文件里进行注册。如:
//这里只想实现插入和查询
@Override
public boolean onCreate() {
smsDbHelper = SmsDbHelper.getInstance(getContext());
return true;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int match = mUriMater.match(uri);
switch (match) {
case CODE_URI_SMS_ALL:
break;
case CODE_URI_SMS_ONE:
long id = ContentUris.parseId(uri);
selection = "_id = ?";
selectionArgs = new String[]{String.valueOf(id)};
break;
}
db = smsDbHelper.getReadableDatabase();
Cursor cr = db.query(SendMsg.TABLE_NAME, projection, selection,
selectionArgs, null, null, sortOrder);
cr.setNotificationUri(getContext().getContentResolver(),URI_SMS_ALL);
return cr;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
//如果匹配就会返回匹配码
int match = mUriMater.match(uri);
if (match != CODE_URI_SMS_ALL)
throw new IllegalArgumentException("Wrong Uri" + uri);
db = smsDbHelper.getWritableDatabase();
long rowId = db.insert(SendMsg.TABLE_NAME, null, values);
if (rowId > 0) {
//说明插入成功
notifyDataSetChange();
return ContentUris.withAppendedId(uri, rowId);
}
db.close();
return null;
}
private void notifyDataSetChange() {
getContext().getContentResolver().notifyChange(URI_SMS_ALL, null);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
//在manifest文件里进行注册
<provider
android:authorities="com.example.lyw.sms.provider"
android:name=".db.SmsProvider"/>
2.ContentReciver
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:
public int delete(Uri uri, String selection, String[]
selectionArgs):该方法用于从ContentProvider删除数据。
public int update(Uri uri, ContentValues values, String
selection, String[] selectionArgs):该方法用于更新ContentProvider中的数据。
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder):该方法用于从
ContentProvider中获取数据。
3、Uri介绍
Uri代表了要操作的数据,Uri主要包含了两部分信息:1>需要操作的ContentProvider ,2>对ContentProvider中的什么数据进行操作,会在程序中定义一下几个字段:
public static final String AUTHORITY ="com.example.lyw.sms.provider";
//对外查询通过这个常量获取
public static final Uri URI_SMS_ALL = Uri.parse("content://" + AUTHORITY
+ "/sms");
+
private static final int CODE_URI_SMS_ALL = 0;
private static final int CODE_URI_SMS_ONE = 1;
4、UriMatcher类使用介绍
因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。UriMatcher类用于匹配Uri。
static {
mUriMater = new UriMatcher(UriMatcher.NO_MATCH);
//注册路径
mUriMater.addURI(AUTHORITY, "sms", CODE_URI_SMS_ONE);
mUriMater.addURI(AUTHORITY, "sms/#", CODE_URI_SMS_ALL);
}
//匹配操作,如果匹配就会返回匹配码
int match = mUriMater.match(uri);
switch (match) {
case CODE_URI_SMS_ALL:
break;
case CODE_URI_SMS_ONE:
long id = ContentUris.parseId(uri);
selection = "_id = ?";
selectionArgs = new String[]{String.valueOf(id)};
break;
}
5.ContentUris类使用介绍
ContentUris类用于操作Uri路径后面的ID部分( CODE_URI_SMS_ALL)。
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri =ContentUris.withAppendedId(uri, rowId);
//生成的URI为:com.example.lyw.sms.provider/sms/rowId;
parseId(uri)方法用于从路径中获取ID部分:
Uri uri = Uri.parse("content://com.example.lyw.sms.provider/sms/10")
long personid = ContentUris.parseId(uri);//personid为10
PS:当修改过provider里的数据需要调用,
getContext().getContentResolver().notifyChange(URI_SMS_ALL, null)
具体应用等我整理号代码再上传。