ContentProvider是不同应用程序间数据交换的标准API;
ContentProvider使用表来组织数据
一旦某个应用程序通过ContentProvider暴露了自己的数据操作接口,那么不管该应用程序是否启动,,其他应用程序都可以通过该接口来操作应用程序内部的数据(插查修删)
操作的大部分数据是来自数据库有时候也使用文件xml和网络
应用程序A可以通过ContentProvider向系统提供访问接口。并提供标识:android:authorities=xxx
其他应用程序可以通过ContentResolver获得系统的访问接口。根据xxx找到A的API。
两边都实现了插入,查询,修改,删除的操作。
实现ContentProvider的步骤:
1. 开发一个ContentProvider子类并实现“插查修删”接口
2. 在AndroidManifest.xml中配置ContentProvider
ContentResolver 使用
1. 获得系统的ContentResolver。contentResolver = getContentResolver();
2. 调用ContentResoler的“插查修删”方法
3. 方法参数如
public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder)
Uri就是Provider的标识,用来区分不同的ContentProvider。
第二个参数projection 代表要返回的内容,实际就是列的名字。
第三个参数selection 设置条件,当于SQL语句中的where后面的。null表示不进行筛选。
第四个参数selectionArgs,配合第三个参数使用,如果第三个参数中有?,则在selectionArgs会替换掉?,可为null
第五个参数sortOrder,按照什么进行排序,相当于SQL语句中的Order by后面的如“DSEC”
代码:
package com.contentproviderdemo;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
public class MyContentProvider extends ContentProvider {
private String TAG = "MyContentProvider";
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
Log.v(TAG, "=== delete ===");
return 0;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
Log.v(TAG, "=== insert ===");
return null;
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
Log.v(TAG, "=== onCreate ===");
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Log.v(TAG, "=== query ===");
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
Log.v(TAG, "=== update ===");
return 0;
}
}
配置ContentProvider
<provider
android:name="com.contentproviderdemo.MyContentProvider"
android:authorities="com.contentproviderdemo.mycontentprovider"
android:exported="true" >
</provider>
ContentResolver的使用
package com.contentresolverdemo;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
ContentResolver contentResolver;
Uri uri = Uri.parse("content://com.contentproviderdemo.mycontentprovider");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获得系统的ContentResolver服务
contentResolver = getContentResolver();
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:// 插入
ContentValues values = new ContentValues();
values.put("name", "fkjava");
Uri newUri = contentResolver.insert(uri, values);
Toast.makeText(MainActivity.this,
"远程的ContentProvider新插入记录的Uri: " + newUri,
Toast.LENGTH_SHORT).show();
break;
case R.id.button2:// 查询
Cursor cursor = contentResolver.query(uri, null,
"quary_where", null, null);
Toast.makeText(MainActivity.this,
"远程的ContentProvider返回的Cursor: " + cursor,
Toast.LENGTH_SHORT).show();
break;
case R.id.button3:// 修改
ContentValues values2 = new ContentValues();
values2.put("name", "fkJava");
int count = contentResolver.update(uri, values2,
"update_where", null);
Toast.makeText(MainActivity.this,
"远程的ContentProvider update()的返回值: " + count,
Toast.LENGTH_SHORT).show();
break;
case R.id.button4:// 删除
int count1 = contentResolver.delete(uri, "delete_where",
null);
Toast.makeText(MainActivity.this,
"远程的ContentProvider 删除的记录数为: " + count1,
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
};
findViewById(R.id.button1).setOnClickListener(listener);
findViewById(R.id.button2).setOnClickListener(listener);
findViewById(R.id.button3).setOnClickListener(listener);
findViewById(R.id.button4).setOnClickListener(listener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
参考:
http://blog.csdn.net/wssiqi/article/details/8132603
=====================================================