ContentProvider是Android核心组件之一。
ContentProvider表示“内容提供者”,
开发人员在创建它时,需要自定义一个类继承ContentProvider,并重写其中的方法,然后并在Android项目的清单文件(AndroidMainfest.xml)中注册。
注册代码如以下:
<provider
android:authorities="com.example.android_contentprovider.PERSON"
android:name="com.example.provider.MyContentProvider"
android:exported="true"
></provider>
authorities表示ContentProvider用于访问数据的URI
name则是表示ContentProvider所在的所在项目的路径
exported表示是否可以被访问
一个ContentProvider的例子就是这样:
package com.example.provider;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.util.Log;
import com.example.util.DbUtil;
/**
* Created by Administrator on 2017/2/7.
*/
public class MyContentProvider extends ContentProvider {
private SQLiteDatabase db;
private UriMatcher uriMatcher;
@Override
public boolean onCreate() {
DbUtil dbUtil=new DbUtil(getContext(),"G150820.db",null,2);
db =dbUtil.getReadableDatabase();
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI("com.example.android_contentprovider.PERSON","student",1);
uriMatcher.addURI("com.example.android_contentprovider.PERSON","student/#",2);
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
int code=uriMatcher.match(uri);
switch (code){
case 1:
return db.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null);
case 2:
long id= ContentUris.parseId(uri);
return db.rawQuery("select * from student where _id=?",new String[]{id+""});
}
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
return 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;
}
}
ContentProvider完成了之后便可以通过ContentResolver进行访问ContentProvider提供的数据。
通过ContextWraper类定义的getContentResolver()方法便可以获取ContentResolver的对象;
public class MainActivity extends AppCompatActivity {
private EditText et_main_id;
private Uri uri;
private ContentResolver contentResolver;
private Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contentResolver = getContentResolver();
list2= (ListView) findViewById(R.id.list2);
et_main_id = (EditText) findViewById(R.id.et_main_id);
}
public void getData(View view){
if (TextUtils.isEmpty(et_main_id.getText().toString())){
uri = Uri.parse("content://com.example.android_contentprovider.PERSON/student");
}else{
String id= et_main_id.getText().toString();
uri = Uri.parse("content://com.example.android_contentprovider.PERSON/student/"+id);
}
cursor = contentResolver.query(uri,null,null,null,null);
}
}