从ContentProvider与ContentResolver和Uri的关系,无论是ContentResolver还是ContentProvider,它们所提供的CRUD方法的第一个参数都是uri,也就是说Uri是ContentProvider 与ContentResolver数据交换的标识符,ContentResolver对指定的Uri执行CRUD操作,但uri并不是真正的数据中心,因此CRUD操作会委托给Uri对应的ContentProvider来实现。
开发ContentProvider
开发ContentProvider只需如下两步:
1:开发一个ContentProvider子类,该子类需要实现query(),insert(),update(),
delete ()。
2:在AndroidMainfest.xml中注册ContentProvider。指定android:authorities属性,
如下实例:
一:开发ContentProvider
public class FirstProvider extends ContentProvider {
@Override
public boolean onCreate() {
System.out.println("=========onCreate( )======");
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
System.out.println("==========query ()==========");
System.out.println("where 的参数为" + selection);
return null;
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
System.out.println("=============insert ()===============");
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
System.out.println(uri + " ======delete()======");
System.out.println("where 的参数为" + selection);
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
System.out.println(uri + "====update ()=======");
System.out.println("where 参数为" + selection + "Values 的参数为" + values);
return 0;
}
}
二:注册ContentProvider
在AndroidMainfest.xml文件中如下:
<provider
android:name="com.youdian.firstprivder.FirstProvider"
android:authorities="com.youdian.firstprivder.provider"
></provider>
三:使用ContentResolver:
public class MainActivity extends Activity implements OnClickListener {
private Button add, query, update, delete;
ContentResolver contentResolver;
Uri uri = Uri.parse("content://com.youdian.firstprivder.provider/ ");// 将字符串转换为Uri对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
add = (Button) findViewById(R.id.add);
add.setOnClickListener(this);
query = (Button) findViewById(R.id.query);
query.setOnClickListener(this);
update = (Button) findViewById(R.id.update);
update.setOnClickListener(this);
delete = (Button) findViewById(R.id.delete);
delete.setOnClickListener(this);
contentResolver = getContentResolver();// 获取contentResolver对象
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.query:
Cursor c = contentResolver.query(uri, null, "query_where", null,
null);
Toast.makeText(this, "远程ContentProvider返回的Cursor为:" + c, 3000)
.show();
break;
case R.id.add:
// contentValues 用来存储到ContentResolver可以处理一组值
ContentValues values = new ContentValues();
values.put("name", "fkjava");
Uri newuri = contentResolver.insert(uri, values);
Toast.makeText(this, "远程ContentProvider新插入的记录的Uri为:+newuri", 3000)
.show();
break;
case R.id.update:
ContentValues values1 = new ContentValues();
values1.put("name", " fkandroid");
int count = contentResolver.update(uri, values1, "update_where",
null);
Toast.makeText(this, "远程ContentProvider更新的记录数为" + count, 3000)
.show();
break;
case R.id.delete:
int coun = contentResolver.delete(uri, "delete_where", null);
Toast.makeText(this, "远程ContentProvider删除的记录数为 :" + coun, 3000)
.show();
break;
}
}
}
运行实例在模拟器上可以发现:
ContentProvider只有一个onCreate()声明周期,当第一次访问该ContentProvider的时候,onCreate()会被回调,onCreate ()方法只会被调用一次,ContentProvider提供的CRUD方法则由其他程序通过ContentResolver调用。