ContentProvider
概述:1、ContentProvider是程序间共享数据的一种机制,是Android提供的数据访问和存储的标准接口。
2、它屏蔽了数据底层的细节实现,提高了数据操作的安全性,当我们不希望访问者直接操作我们的底层
数据但又要为其提供数据接口时,我们可以为自己的数据建立ContentProvider以供外部程序访问。
3、ContentProvider是由ContenResolver代理得到的,并不需要用户手动实例化。
4、注册ContentProvider content://com.ssj.android.provider.UserProvider/tb_user/122
<provider android:name="UserProvider" android:authorities="com.ssj.android.provider.UserProvider"/>
abstract ContentProvider
abstract boolean onCreate();
abstract Uri insert(Uri uri,ContentValues values);
abstract int delete(Uri uri,String where,String[] whereArgs);
abstract Cursor query(Uri uri,String[] columnNames,Stirng where,
String whereArgs,String order);
abstract update(Uri uri,ContentValues values,String where,String whereArgs);
abstract String getType(Uri uri);//返回指定资源的类型
abstract ContentResolver
通过传入的Uri获得相应的ContentProvider,在通过ContentProvider执行相应的数据操作方法。
ContentResolver(Context context);//可通过Activity的this。方式得到
final Uri insert(Uri uri,ContentValues values);
final int delete(Uri uri,String where,String[] whereArgs);
final Cursor query(Uri uri,String[] columnNames,Stirng where,
String whereArgs,String order);
final update(Uri uri,ContentValues values,String where,String whereArgs);
final String getType(Uri uri);//返回指定资源的类型
final InputStream openInputStream(Uri uri);
final outputStream openOutputStream(Uri uri);
Uri 1、格式: 协议头://唯一标示(可随意写,保证唯一性即可,通常为包名.类名)/数据路径/记录id
content://com.ssj.android.provider/tb_user/122 ----------操作数据库文件user表id为122的记录
content://com.ssj.android.provider/user\name ----------操作xml文件user中的name节点
2、通过UriMatcher 的match()method为执行特定SQL语句提供判断条件
3、ContentProvider的insert方法要求返回Uri,所以要解析uri。
static Uri parse(String uri);
UriMatcher:
1、在ContentProvider中建立UriMatcher匹配库。
2、当没有匹配项时返回-1
3、#匹配一个数字, *匹配人一个字符
UriMatcher(int matchCode);
void addURI(String authority,String pathDate,int matchCode);//authourity:协议头,pathDate:数据路径 ,matchCode:匹配时的返回值
int match(Uri uri);
URIUtils
ContentUris:用于向Uri附加id或从Uri中提取id
ContentUrils();
static long parseId(Uri uri);//从Uri中解析id
static withAppendedId(Uri uri,long id);//向Uri中附加id
UriMatcher示例:
Class MyContentProvider extends ContentProvider
{ //用户表tb_user(userid,username),日志表tb_rz(rzid,rzbt,rznr,userid)
private final static int USERS=1;
private final static int USER=11;
private final static int RZS=2;
private final static int RZ=21;
private UriMatcher myMatcher=new UriMatcher(-1);
//建立uri匹配库
static
{
myMatcher.addUri("com.ssj.android.provider","tb_user",USERS);
myMatcher.addUri("com.ssj.android.provider","tb_user/#",USER);
myMatcher.addUri("com.ssj.android.provider","tb_rz",RZS);
myMatcher.addUri("com.ssj.android.provider","tb_rz/#",RZ);
}
public Stirng getType(Uri uri)
{
int macth=myMatcher.macth(uri);
switch(macth)
{
case USERS:
return "vnd.android.cursor.dir/tb_user"; break;
case USER:
return "vnd.android.cursor.item/tb_user"; break;
case RZS:
return return "vnd.android.cursor.dir/tb_rz"; break;
case RZ:
return "vnd.android.cursor.item/tb_rz"; break;
default:
return null;
}
}
}