ContentProvider的使用
概念:contentprovider是内容提供者,很明显,内容提供者就是提供数据的,它是用来将自己的数据暴漏出来,供其他的程序访问并且进行增删改查的,同样的他也是四大组件之一,他的创建也需要在清单文件中声明,这里就不详细的描述了,先简单的描述一下他的使用方法,
步骤:1,创建类,继承自contentprovider,
2,创建一个匹配器,用来进行数据访问时数据的匹配
3,实现需要实现的方法,这里的实现的方法就是想要做的事情,并不是全部都要实现,共有六中方法。
4,清单文件中注册,并写上权限,权限就是匹配器中的权限,
实现::::::::::::匹配器::::::::::::::::::::::方法判断::::::::::::::::::::::
创建类:
//继承并实现六个方法,不需要的可以不操做,他们的参数和sql非常的相似,都是通过占位符和条件进行约束的,
public class MyProvider extends ContentProvider{// query:查询// insert:插入// update:更新// delete:删除// getType:得到数据类型// onCreate: private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);//初始化匹配器 static{//创建静态代码块,随着类的加载而加载,声明周期和类相同,// 给匹配器添加uri用来当做一把钥匙,别的程序只有符合相应操作的钥匙匹配才会打开相应的方法,你可以这么理解
//模式可以使任意整数,这里以1,2为例,使用#通配符代表任意的表,使用#带表表中的任意的一行,
//首先:一个标准的uri的写法是这样的:content:://com.example.administrator.Myprovider/table1
// matcher.addURI("权限,这里你可以写这个类的包名加类名","访问的路径,也就是相应的表名",模式);
matcher.addURI("com.example.administrator.Myprovider","table1",1); matcher.addURI("com.example.administrator.Myprovider","table1/#",2); }// 有了匹配器,就可以通过匹配器的匹配进行操作了,只要其他程序传递过来的uri符合其中的某一个uri就打开某一个uri来共对方使用,否则,对方无法操作,这也保证数据的安全性// 这里只是通过查询为例,其实大同小异,这里就写查询为例子进行简单的描述 @Override public boolean onCreate() {
//初始化,只有当程序视图访问是才会被初始化
return false;
}
@Nullable
@Override//参数:uri标识,确定查询的列的集合,s,string1两个用来约束查询那些行,最后是排序的方式。
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
// 先匹配uri,判断符合哪个
switch (matcher.match(uri)){
// 如果是1,匹配mode是一的
case 1:
break;
//如果是2,符合是2的mode这样就进行相应的操作即可
case 2:
break;
}
return null;
}
@Nullable
@Override//通过uri返回一个MIME类型的串,这个方法用的不多。
public String getType(Uri uri) {
return null;
}
@Nullable
@Override//参数uri标识,插入的内容存放在contentvelues里,
public Uri insert(Uri uri, ContentValues contentValues) {
return null;
}
@Override//uri标识,后两个参数约束删除的行数
public int delete(Uri uri, String s, String[] strings) {
return 0;
}
@Override//uri标识,数据源,最后两个约束更新的那些行行数,和sql非常的相似,都是通过占位符和条件进行约束的,
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
return 0;
}
}
内容就不写例子了,相信大家一看就会理解,多了反而啰嗦,最后记得在清单中注册就行了。
<provider
android:authorities="com.example.administrator.MyProvider"
android:name=".MyProvider"/>这里一定要写明权限,不然会出大事的,哈哈
这样一看是不是非常的简单.,既然能够创建提供者,我们在创建一个接受者看看两者的关系吧?
创建一个内容接受者(我是这么叫的,可能大家命名不同,不影响技术交流)contentresover,
首先创建接受着对象,然后就可以通过对象直接调用其中的方法了,只需要将uri对象传入,再将占位符和条件等传入,就能够直接进行对库进行操作,前提是uri必须和提供者的一致,现在分析一下上边的提供者,和下边的接受者,你发现了什么???uri是不是一样呢?现在的你多多少少理解了吧
public class MainActivity extends AppCompatActivity {
private ContentResolver resolver;
public static final String URI = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resolver = getContentResolver();
Uri uri = Uri.parse("content:://com.example.administrator.Myprovider/table1");
resolver.delete(uri, "id=?", new String[]{"1"});
}
}